diff --git a/src/Libraries/NRefactory/ICSharpCode.NRefactory.CSharp/Analysis/ControlFlow.cs b/src/Libraries/NRefactory/ICSharpCode.NRefactory.CSharp/Analysis/ControlFlow.cs index d2bdf7af9e..2812375b11 100644 --- a/src/Libraries/NRefactory/ICSharpCode.NRefactory.CSharp/Analysis/ControlFlow.cs +++ b/src/Libraries/NRefactory/ICSharpCode.NRefactory.CSharp/Analysis/ControlFlow.cs @@ -1,4 +1,4 @@ -// Copyright (c) AlphaSierraPapa for the SharpDevelop Team +// Copyright (c) AlphaSierraPapa for the SharpDevelop Team // // Permission is hereby granted, free of charge, to any person obtaining a copy of this // software and associated documentation files (the "Software"), to deal in the Software @@ -420,7 +420,8 @@ namespace ICSharpCode.NRefactory.CSharp.Analysis falseEnd = ifElseStatement.FalseStatement.AcceptVisitor(this, falseBegin); } ControlFlowNode end = builder.CreateEndNode(ifElseStatement); - Connect(trueEnd, end); + if (trueEnd != null) + Connect(trueEnd, end); if (falseEnd != null) { Connect(falseEnd, end); } else if (cond != true) { diff --git a/src/Libraries/NRefactory/ICSharpCode.NRefactory.CSharp/Ast/AstNode.cs b/src/Libraries/NRefactory/ICSharpCode.NRefactory.CSharp/Ast/AstNode.cs index 624cf45977..bc4d27de03 100644 --- a/src/Libraries/NRefactory/ICSharpCode.NRefactory.CSharp/Ast/AstNode.cs +++ b/src/Libraries/NRefactory/ICSharpCode.NRefactory.CSharp/Ast/AstNode.cs @@ -1,4 +1,4 @@ -// +// // AstNode.cs // // Author: @@ -366,6 +366,13 @@ namespace ICSharpCode.NRefactory.CSharp lastChild = child; } } + + public void InsertChildsBefore(AstNode nextSibling, Role role, params T[] child) where T : AstNode + { + foreach (var cur in child) { + InsertChildBefore(nextSibling, cur, role); + } + } public void InsertChildBefore (AstNode nextSibling, T child, Role role) where T : AstNode { @@ -606,7 +613,6 @@ namespace ICSharpCode.NRefactory.CSharp return Parent.GetPrevNode (); return null; } - // filters all non c# nodes (comments, white spaces or pre processor directives) public AstNode GetCSharpNodeBefore (AstNode node) { @@ -619,11 +625,22 @@ namespace ICSharpCode.NRefactory.CSharp return null; } + #region GetNodeAt + /// + /// Gets the node specified by T at the location line, column. This is useful for getting a specific node from the tree. For example searching + /// the current method declaration. + /// (End exclusive) + /// public AstNode GetNodeAt (int line, int column, Predicate pred = null) { return GetNodeAt (new TextLocation (line, column), pred); } + /// + /// Gets the node specified by pred at location. This is useful for getting a specific node from the tree. For example searching + /// the current method declaration. + /// (End exclusive) + /// public AstNode GetNodeAt (TextLocation location, Predicate pred = null) { AstNode result = null; @@ -646,6 +663,11 @@ namespace ICSharpCode.NRefactory.CSharp return result; } + /// + /// Gets the node specified by T at the location line, column. This is useful for getting a specific node from the tree. For example searching + /// the current method declaration. + /// (End exclusive) + /// public T GetNodeAt (int line, int column) where T : AstNode { return GetNodeAt (new TextLocation (line, column)); @@ -654,6 +676,7 @@ namespace ICSharpCode.NRefactory.CSharp /// /// Gets the node specified by T at location. This is useful for getting a specific node from the tree. For example searching /// the current method declaration. + /// (End exclusive) /// public T GetNodeAt (TextLocation location) where T : AstNode { @@ -676,7 +699,86 @@ namespace ICSharpCode.NRefactory.CSharp } return result; } + + #endregion + + #region GetAdjacentNodeAt + /// + /// Gets the node specified by pred at the location line, column. This is useful for getting a specific node from the tree. For example searching + /// the current method declaration. + /// (End inclusive) + /// + public AstNode GetAdjacentNodeAt(int line, int column, Predicate pred = null) + { + return GetAdjacentNodeAt (new TextLocation (line, column), pred); + } + /// + /// Gets the node specified by pred at location. This is useful for getting a specific node from the tree. For example searching + /// the current method declaration. + /// (End inclusive) + /// + public AstNode GetAdjacentNodeAt (TextLocation location, Predicate pred = null) + { + AstNode result = null; + AstNode node = this; + while (node.FirstChild != null) { + var child = node.FirstChild; + while (child != null) { + if (child.StartLocation <= location && location <= child.EndLocation) { + if (pred == null || pred (child)) + result = child; + node = child; + break; + } + child = child.NextSibling; + } + // found no better child node - therefore the parent is the right one. + if (child == null) + break; + } + return result; + } + + /// + /// Gets the node specified by T at the location line, column. This is useful for getting a specific node from the tree. For example searching + /// the current method declaration. + /// (End inclusive) + /// + public T GetAdjacentNodeAt(int line, int column) where T : AstNode + { + return GetAdjacentNodeAt (new TextLocation (line, column)); + } + + /// + /// Gets the node specified by T at location. This is useful for getting a specific node from the tree. For example searching + /// the current method declaration. + /// (End inclusive) + /// + public T GetAdjacentNodeAt (TextLocation location) where T : AstNode + { + T result = null; + AstNode node = this; + while (node.FirstChild != null) { + var child = node.FirstChild; + while (child != null) { + if (child.StartLocation <= location && location < child.EndLocation) { + if (child is T) + result = (T)child; + node = child; + break; + } + child = child.NextSibling; + } + // found no better child node - therefore the parent is the right one. + if (child == null) + break; + } + return result; + } + #endregion + + /// /// Gets the node that fully contains the range from startLocation to endLocation. /// @@ -729,7 +831,7 @@ namespace ICSharpCode.NRefactory.CSharp if (IsNull) return ""; var w = new StringWriter (); - AcceptVisitor (new CSharpOutputVisitor (w, formattingOptions ?? new CSharpFormattingOptions ())); + AcceptVisitor (new CSharpOutputVisitor (w, formattingOptions ?? FormattingOptionsFactory.CreateMono ())); return w.ToString (); } diff --git a/src/Libraries/NRefactory/ICSharpCode.NRefactory.CSharp/Ast/DepthFirstAstVisitor.cs b/src/Libraries/NRefactory/ICSharpCode.NRefactory.CSharp/Ast/DepthFirstAstVisitor.cs index b1c1600ef5..68bce6c35b 100644 --- a/src/Libraries/NRefactory/ICSharpCode.NRefactory.CSharp/Ast/DepthFirstAstVisitor.cs +++ b/src/Libraries/NRefactory/ICSharpCode.NRefactory.CSharp/Ast/DepthFirstAstVisitor.cs @@ -49,11 +49,26 @@ namespace ICSharpCode.NRefactory.CSharp VisitChildren (unit); } - public virtual void VisitComment (Comment comment) + public virtual void VisitComment(Comment comment) { - VisitChildren (comment); + VisitChildren(comment); } - + + public virtual void VisitNewLine(NewLineNode newLineNode) + { + VisitChildren(newLineNode); + } + + public virtual void VisitWhitespace(WhitespaceNode whitespaceNode) + { + VisitChildren(whitespaceNode); + } + + public virtual void VisitText(TextNode textNode) + { + VisitChildren(textNode); + } + public virtual void VisitDocumentationReference (DocumentationReference documentationReference) { VisitChildren (documentationReference); @@ -637,6 +652,21 @@ namespace ICSharpCode.NRefactory.CSharp return VisitChildren (comment); } + public virtual T VisitNewLine(NewLineNode newLineNode) + { + return VisitChildren(newLineNode); + } + + public virtual T VisitWhitespace(WhitespaceNode whitespaceNode) + { + return VisitChildren(whitespaceNode); + } + + public virtual T VisitText(TextNode textNode) + { + return VisitChildren(textNode); + } + public virtual T VisitDocumentationReference (DocumentationReference documentationReference) { return VisitChildren (documentationReference); @@ -1220,6 +1250,21 @@ namespace ICSharpCode.NRefactory.CSharp return VisitChildren (comment, data); } + public virtual S VisitNewLine(NewLineNode newLineNode, T data) + { + return VisitChildren(newLineNode, data); + } + + public virtual S VisitWhitespace(WhitespaceNode whitespaceNode, T data) + { + return VisitChildren(whitespaceNode, data); + } + + public virtual S VisitText(TextNode textNode, T data) + { + return VisitChildren(textNode, data); + } + public virtual S VisitDocumentationReference (DocumentationReference documentationReference, T data) { return VisitChildren (documentationReference, data); diff --git a/src/Libraries/NRefactory/ICSharpCode.NRefactory.CSharp/Ast/GeneralScope/NewLineNode.cs b/src/Libraries/NRefactory/ICSharpCode.NRefactory.CSharp/Ast/GeneralScope/NewLineNode.cs new file mode 100644 index 0000000000..a2cba46c8e --- /dev/null +++ b/src/Libraries/NRefactory/ICSharpCode.NRefactory.CSharp/Ast/GeneralScope/NewLineNode.cs @@ -0,0 +1,132 @@ +using System; +namespace ICSharpCode.NRefactory.CSharp +{ + public enum NewLineType { + Unix, + Windows, + Mac + } + + /// + /// A New line node represents a line break in the text. + /// + public abstract class NewLineNode : AstNode + { + public override NodeType NodeType { + get { + return NodeType.Whitespace; + } + } + + public abstract NewLineType NewLineType { + get; + } + + TextLocation startLocation; + public override TextLocation StartLocation { + get { + return startLocation; + } + } + + public override TextLocation EndLocation { + get { + return new TextLocation (startLocation.Line + 1, 1); + } + } + + public NewLineNode() : this (TextLocation.Empty) + { + } + + public NewLineNode(TextLocation startLocation) + { + this.startLocation = startLocation; + } + + public override void AcceptVisitor(IAstVisitor visitor) + { + visitor.VisitNewLine (this); + } + + public override T AcceptVisitor(IAstVisitor visitor) + { + return visitor.VisitNewLine (this); + } + + public override S AcceptVisitor(IAstVisitor visitor, T data) + { + return visitor.VisitNewLine (this, data); + } + } + + public class UnixNewLine : NewLineNode + { + public override NewLineType NewLineType { + get { + return NewLineType.Unix; + } + } + + public UnixNewLine() + { + } + + public UnixNewLine(TextLocation startLocation) : base (startLocation) + { + } + + protected internal override bool DoMatch(AstNode other, PatternMatching.Match match) + { + var o = other as UnixNewLine; + return o != null; + } + } + + public class WindowsNewLine : NewLineNode + { + public override NewLineType NewLineType { + get { + return NewLineType.Windows; + } + } + + public WindowsNewLine() + { + } + + public WindowsNewLine(TextLocation startLocation) : base (startLocation) + { + } + + protected internal override bool DoMatch(AstNode other, PatternMatching.Match match) + { + var o = other as WindowsNewLine; + return o != null; + } + } + + public class MacNewLine : NewLineNode + { + public override NewLineType NewLineType { + get { + return NewLineType.Mac; + } + } + + public MacNewLine() + { + } + + public MacNewLine(TextLocation startLocation) : base (startLocation) + { + } + + protected internal override bool DoMatch(AstNode other, PatternMatching.Match match) + { + var o = other as MacNewLine; + return o != null; + } + } +} + diff --git a/src/Libraries/NRefactory/ICSharpCode.NRefactory.CSharp/Ast/GeneralScope/TextNode.cs b/src/Libraries/NRefactory/ICSharpCode.NRefactory.CSharp/Ast/GeneralScope/TextNode.cs new file mode 100644 index 0000000000..4c7f9b9425 --- /dev/null +++ b/src/Libraries/NRefactory/ICSharpCode.NRefactory.CSharp/Ast/GeneralScope/TextNode.cs @@ -0,0 +1,94 @@ +// +// TextNode.cs +// +// Author: +// Mike Krüger +// +// Copyright (c) 2012 Xamarin Inc. (http://xamarin.com) +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +using System; +namespace ICSharpCode.NRefactory.CSharp +{ + /// + /// A text node contains text without syntactic or semantic information. + /// (non parseable part of a text) + /// + public class TextNode : AstNode + { + public override NodeType NodeType { + get { + return NodeType.Whitespace; + } + } + + public string Text { + get; + set; + } + + TextLocation startLocation; + public override TextLocation StartLocation { + get { + return startLocation; + } + } + + TextLocation endLocation; + public override TextLocation EndLocation { + get { + return endLocation; + } + } + + public TextNode(string text) : this (text, TextLocation.Empty, TextLocation.Empty) + { + } + + public TextNode(string text, TextLocation startLocation, TextLocation endLocation) + { + this.Text = text; + this.startLocation = startLocation; + this.endLocation = endLocation; + } + + public override void AcceptVisitor(IAstVisitor visitor) + { + visitor.VisitText (this); + } + + public override T AcceptVisitor(IAstVisitor visitor) + { + return visitor.VisitText (this); + } + + public override S AcceptVisitor(IAstVisitor visitor, T data) + { + return visitor.VisitText (this, data); + } + + protected internal override bool DoMatch(AstNode other, PatternMatching.Match match) + { + var o = other as TextNode; + return o != null && o.Text == Text; + } + } +} + diff --git a/src/Libraries/NRefactory/ICSharpCode.NRefactory.CSharp/Ast/GeneralScope/WhitespaceNode.cs b/src/Libraries/NRefactory/ICSharpCode.NRefactory.CSharp/Ast/GeneralScope/WhitespaceNode.cs new file mode 100644 index 0000000000..c7e37f704d --- /dev/null +++ b/src/Libraries/NRefactory/ICSharpCode.NRefactory.CSharp/Ast/GeneralScope/WhitespaceNode.cs @@ -0,0 +1,91 @@ +// +// WhitespaceNode.cs +// +// Author: +// Mike Krüger +// +// Copyright (c) 2012 Xamarin Inc. (http://xamarin.com) +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +using System; +namespace ICSharpCode.NRefactory.CSharp +{ + /// + /// A Whitespace node contains only whitespaces. + /// + public class WhitespaceNode : AstNode + { + public override NodeType NodeType { + get { + return NodeType.Whitespace; + } + } + + public string WhiteSpaceText { + get; + set; + } + + TextLocation startLocation; + public override TextLocation StartLocation { + get { + return startLocation; + } + } + + public override TextLocation EndLocation { + get { + return new TextLocation (startLocation.Line, startLocation.Column + WhiteSpaceText.Length); + } + } + + public WhitespaceNode(string whiteSpaceText) : this (whiteSpaceText, TextLocation.Empty) + { + } + + public WhitespaceNode(string whiteSpaceText, TextLocation startLocation) + { + this.WhiteSpaceText = WhiteSpaceText; + this.startLocation = startLocation; + } + + public override void AcceptVisitor(IAstVisitor visitor) + { + visitor.VisitWhitespace (this); + } + + public override T AcceptVisitor(IAstVisitor visitor) + { + return visitor.VisitWhitespace (this); + } + + public override S AcceptVisitor(IAstVisitor visitor, T data) + { + return visitor.VisitWhitespace (this, data); + } + + protected internal override bool DoMatch(AstNode other, PatternMatching.Match match) + { + var o = other as WhitespaceNode; + return o != null && o.WhiteSpaceText == WhiteSpaceText; + } + } +} + diff --git a/src/Libraries/NRefactory/ICSharpCode.NRefactory.CSharp/Ast/IAstVisitor.cs b/src/Libraries/NRefactory/ICSharpCode.NRefactory.CSharp/Ast/IAstVisitor.cs index b82d8ca12e..58836e655d 100644 --- a/src/Libraries/NRefactory/ICSharpCode.NRefactory.CSharp/Ast/IAstVisitor.cs +++ b/src/Libraries/NRefactory/ICSharpCode.NRefactory.CSharp/Ast/IAstVisitor.cs @@ -137,6 +137,9 @@ namespace ICSharpCode.NRefactory.CSharp void VisitPrimitiveType(PrimitiveType primitiveType); void VisitComment(Comment comment); + void VisitNewLine(NewLineNode newLineNode); + void VisitWhitespace(WhitespaceNode whitespaceNode); + void VisitText(TextNode textNode); void VisitPreProcessorDirective(PreProcessorDirective preProcessorDirective); void VisitDocumentationReference(DocumentationReference documentationReference); @@ -265,6 +268,9 @@ namespace ICSharpCode.NRefactory.CSharp S VisitPrimitiveType(PrimitiveType primitiveType); S VisitComment(Comment comment); + S VisitWhitespace(WhitespaceNode whitespaceNode); + S VisitText(TextNode textNode); + S VisitNewLine(NewLineNode newLineNode); S VisitPreProcessorDirective(PreProcessorDirective preProcessorDirective); S VisitDocumentationReference(DocumentationReference documentationReference); @@ -393,6 +399,9 @@ namespace ICSharpCode.NRefactory.CSharp S VisitPrimitiveType(PrimitiveType primitiveType, T data); S VisitComment(Comment comment, T data); + S VisitNewLine(NewLineNode newLineNode, T data); + S VisitWhitespace(WhitespaceNode whitespaceNode, T data); + S VisitText(TextNode textNode, T data); S VisitPreProcessorDirective(PreProcessorDirective preProcessorDirective, T data); S VisitDocumentationReference(DocumentationReference documentationReference, T data); diff --git a/src/Libraries/NRefactory/ICSharpCode.NRefactory.CSharp/Ast/ObservableAstVisitor.cs b/src/Libraries/NRefactory/ICSharpCode.NRefactory.CSharp/Ast/ObservableAstVisitor.cs index b55b5fdf14..3d47dd81fc 100644 --- a/src/Libraries/NRefactory/ICSharpCode.NRefactory.CSharp/Ast/ObservableAstVisitor.cs +++ b/src/Libraries/NRefactory/ICSharpCode.NRefactory.CSharp/Ast/ObservableAstVisitor.cs @@ -60,9 +60,38 @@ namespace ICSharpCode.NRefactory.CSharp handler (comment, data); return VisitChildren (comment, data); } - - public event Action PreProcessorDirectiveVisited; + public event Action NewLineVisited; + + S IAstVisitor.VisitNewLine(NewLineNode newLineNode, T data) + { + var handler = NewLineVisited; + if (handler != null) + handler(newLineNode, data); + return VisitChildren(newLineNode, data); + } + + public event Action WhitespaceVisited; + + S IAstVisitor.VisitWhitespace(WhitespaceNode whitespace, T data) + { + var handler = WhitespaceVisited; + if (handler != null) + handler(whitespace, data); + return VisitChildren(whitespace, data); + } + + public event Action TextVisited; + + S IAstVisitor.VisitText(TextNode textNode, T data) + { + var handler = TextVisited; + if (handler != null) + handler(textNode, data); + return VisitChildren(textNode, data); + } + + public event Action PreProcessorDirectiveVisited; S IAstVisitor.VisitPreProcessorDirective (PreProcessorDirective preProcessorDirective, T data) { var handler = PreProcessorDirectiveVisited; diff --git a/src/Libraries/NRefactory/ICSharpCode.NRefactory.CSharp/Ast/Roles.cs b/src/Libraries/NRefactory/ICSharpCode.NRefactory.CSharp/Ast/Roles.cs index f958e24659..a7408c91d7 100644 --- a/src/Libraries/NRefactory/ICSharpCode.NRefactory.CSharp/Ast/Roles.cs +++ b/src/Libraries/NRefactory/ICSharpCode.NRefactory.CSharp/Ast/Roles.cs @@ -68,6 +68,9 @@ namespace ICSharpCode.NRefactory.CSharp public static readonly TokenRole Colon = new TokenRole (":"); public static readonly TokenRole DoubleColon = new TokenRole ("::"); public static readonly Role Comment = new Role ("Comment"); + public static readonly Role NewLine = new Role ("NewLine"); + public static readonly Role Whitespace = new Role ("Whitespace"); + public static readonly Role Text = new Role ("Text"); public static readonly Role PreProcessorDirective = new Role ("PreProcessorDirective"); public static readonly Role Error = new Role ("Error"); diff --git a/src/Libraries/NRefactory/ICSharpCode.NRefactory.CSharp/Ast/TypeMembers/ParameterDeclaration.cs b/src/Libraries/NRefactory/ICSharpCode.NRefactory.CSharp/Ast/TypeMembers/ParameterDeclaration.cs index 0942c6dc34..15b4993d23 100644 --- a/src/Libraries/NRefactory/ICSharpCode.NRefactory.CSharp/Ast/TypeMembers/ParameterDeclaration.cs +++ b/src/Libraries/NRefactory/ICSharpCode.NRefactory.CSharp/Ast/TypeMembers/ParameterDeclaration.cs @@ -121,10 +121,11 @@ namespace ICSharpCode.NRefactory.CSharp { } - public ParameterDeclaration(AstType type, string name) + public ParameterDeclaration(AstType type, string name, ParameterModifier modifier = ParameterModifier.None) { - this.Type = type; - this.Name = name; + Type = type; + Name = name; + ParameterModifier = modifier; } } } diff --git a/src/Libraries/NRefactory/ICSharpCode.NRefactory.CSharp/Completion/CSharpCompletionEngine.cs b/src/Libraries/NRefactory/ICSharpCode.NRefactory.CSharp/Completion/CSharpCompletionEngine.cs index 2f3e739421..8f1f98f00c 100644 --- a/src/Libraries/NRefactory/ICSharpCode.NRefactory.CSharp/Completion/CSharpCompletionEngine.cs +++ b/src/Libraries/NRefactory/ICSharpCode.NRefactory.CSharp/Completion/CSharpCompletionEngine.cs @@ -1,4 +1,4 @@ -// +// // CSharpCompletionEngine.cs // // Author: @@ -68,7 +68,7 @@ namespace ICSharpCode.NRefactory.CSharp.Completion this.document = document; this.factory = factory; // Set defaults for additional input properties - this.FormattingPolicy = new CSharpFormattingOptions (); + this.FormattingPolicy = FormattingOptionsFactory.CreateMono (); this.EolMarker = Environment.NewLine; this.IndentString = "\t"; } @@ -207,26 +207,55 @@ namespace ICSharpCode.NRefactory.CSharp.Completion return CreateCompletionData(location, resolveResult.Item1, expr.Node, resolveResult.Item2); } + bool IsInPreprocessorDirective() + { + var text = GetMemberTextToCaret().Item1; + var miniLexer = new MiniLexer(text); + miniLexer.Parse(); + return miniLexer.IsInPreprocessorDirective; + } + + IEnumerable HandleObjectInitializer(CompilationUnit unit, AstNode n) + { + var p = n.Parent; + while (p != null && !(p is ObjectCreateExpression)) { + p = p.Parent; + } + if (p != null) { + var contextList = new CompletionDataWrapper(this); + var initializerResult = ResolveExpression(p, unit); + if (initializerResult != null && initializerResult.Item1.Type.Kind != TypeKind.Unknown) { + + foreach (var m in initializerResult.Item1.Type.GetMembers (m => m.IsPublic && (m.EntityType == EntityType.Property || m.EntityType == EntityType.Field))) { + contextList.AddMember(m); + } + var enumerableType = typeof(IEnumerable<>).ToTypeReference().Resolve(ctx); + // check if we may be in a collection initializer, or enumerable initializer + if (enumerableType.Kind == TypeKind.Unknown || !initializerResult.Item1.Type.GetDefinition().IsDerivedFrom(enumerableType.GetDefinition())) { + return contextList.Result; + } + } + } + return null; + } + IEnumerable MagicKeyCompletion(char completionChar, bool controlSpace) { ExpressionResult expr; Tuple resolveResult; - switch (completionChar) { // Magic key completion case ':': case '.': - if (IsInsideCommentOrString()) { + if (IsInsideCommentStringOrDirective()) { return Enumerable.Empty(); } return HandleMemberReferenceCompletion(GetExpressionBeforeCursor()); case '#': - if (IsInsideCommentOrString()) { + if (!IsInPreprocessorDirective()) return null; - } return GetDirectiveCompletionData(); - -// XML doc completion + // XML doc completion case '<': if (IsInsideDocComment()) { return GetXmlDocumentationCompletionData(); @@ -265,11 +294,13 @@ namespace ICSharpCode.NRefactory.CSharp.Completion // Parameter completion case '(': - if (IsInsideCommentOrString()) { + if (IsInsideCommentStringOrDirective()) { return null; } var invoke = GetInvocationBeforeCursor(true); if (invoke == null) { + if (controlSpace) + return DefaultControlSpaceItems(invoke); return null; } if (invoke.Node is TypeOfExpression) { @@ -287,7 +318,6 @@ namespace ICSharpCode.NRefactory.CSharp.Completion if (controlSpace) { return DefaultControlSpaceItems(invoke); } - return null; case '=': return controlSpace ? DefaultControlSpaceItems() : null; @@ -303,12 +333,13 @@ namespace ICSharpCode.NRefactory.CSharp.Completion // Completion on space: case ' ': - if (IsInsideCommentOrString()) { - return null; - } - int tokenIndex = offset; string token = GetPreviousToken(ref tokenIndex, false); + if (IsInsideCommentStringOrDirective()) { + if (IsInPreprocessorDirective()) + return HandleKeywordCompletion(tokenIndex, token); + return null; + } // check propose name, for context (but only in control space context) //IType isAsType = null; var isAsExpression = GetExpressionAt(offset); @@ -461,8 +492,13 @@ namespace ICSharpCode.NRefactory.CSharp.Completion return null; case ":": if (currentMember == null) { + token = GetPreviousToken(ref tokenIndex, false); + token = GetPreviousToken(ref tokenIndex, false); + if (token == "enum") + return HandleEnumContext(); var wrapper = new CompletionDataWrapper(this); - AddTypesAndNamespaces(wrapper, GetState(), null, t => currentType != null ? !currentType.ReflectionName.Equals(t.ReflectionName) : true); + + AddTypesAndNamespaces(wrapper, GetState(), null, t => currentType != null && !currentType.ReflectionName.Equals(t.ReflectionName) ? t : null); return wrapper.Result; } return null; @@ -475,7 +511,7 @@ namespace ICSharpCode.NRefactory.CSharp.Completion return keywordCompletion; // Automatic completion default: - if (IsInsideCommentOrString()) { + if (IsInsideCommentStringOrDirective()) { return null; } if (IsInLinqContext(offset)) { @@ -565,7 +601,7 @@ namespace ICSharpCode.NRefactory.CSharp.Completion return null; } - if (identifierStart == null && !string.IsNullOrEmpty(token) && !IsInsideCommentOrString() && (prevToken2 == ";" || prevToken2 == "{" || prevToken2 == "}")) { + if (identifierStart == null && !string.IsNullOrEmpty(token) && !IsInsideCommentStringOrDirective() && (prevToken2 == ";" || prevToken2 == "{" || prevToken2 == "}")) { char last = token [token.Length - 1]; if (char.IsLetterOrDigit(last) || last == '_' || token == ">") { return HandleKeywordCompletion(tokenIndex, token); @@ -599,24 +635,9 @@ namespace ICSharpCode.NRefactory.CSharp.Completion // Handle object/enumerable initialzer expressions: "new O () { P$" if (n is IdentifierExpression && n.Parent is ArrayInitializerExpression) { - var p = n.Parent; - while (p != null && !(p is ObjectCreateExpression)) { - p = p.Parent; - } - if (p != null) { - var initializerResult = ResolveExpression(p, identifierStart.Unit); - if (initializerResult != null && initializerResult.Item1.Type.Kind != TypeKind.Unknown) { - - foreach (var m in initializerResult.Item1.Type.GetMembers (m => m.IsPublic && (m.EntityType == EntityType.Property || m.EntityType == EntityType.Field))) { - contextList.AddMember(m); - } - var enumerableType = typeof(IEnumerable<>).ToTypeReference().Resolve(ctx); - // check if we may be in a collection initializer, or enumerable initializer - if (enumerableType.Kind == TypeKind.Unknown || !initializerResult.Item1.Type.GetDefinition().IsDerivedFrom(enumerableType.GetDefinition())) { - return contextList.Result; - } - } - } + var result = HandleObjectInitializer(identifierStart.Unit, n); + if (result != null) + return result; } if (n != null && n.Parent is InvocationExpression) { @@ -845,13 +866,26 @@ namespace ICSharpCode.NRefactory.CSharp.Completion } return null; } - + + string[] validEnumBaseTypes = { "byte", "sbyte", "short", "int", "long", "ushort", "uint", "ulong" }; IEnumerable HandleEnumContext() { var cu = ParseStub("a", false); if (cu == null) { return null; } + + var curType = cu.GetNodeAt (location); + if (curType == null || curType.ClassType != ClassType.Enum) { + cu = ParseStub("a {}", false); + var node = cu.GetNodeAt(location); + if (node != null) { + var wrapper = new CompletionDataWrapper(this); + AddKeywords(wrapper, validEnumBaseTypes); + return wrapper.Result; + } + } + var member = cu.GetNodeAt(location); if (member != null && member.NameToken.EndLocation < location) { return DefaultControlSpaceItems(); @@ -862,7 +896,7 @@ namespace ICSharpCode.NRefactory.CSharp.Completion bool IsInLinqContext(int offset) { string token; - while (null != (token = GetPreviousToken (ref offset, true)) && !IsInsideCommentOrString ()) { + while (null != (token = GetPreviousToken (ref offset, true)) && !IsInsideCommentStringOrDirective ()) { if (token == "from") { return true; } @@ -880,7 +914,7 @@ namespace ICSharpCode.NRefactory.CSharp.Completion if (node is Accessor) { node = node.Parent; } - var contextList = new CompletionDataWrapper (this); + var contextList = new CompletionDataWrapper(this); if (node is PropertyDeclaration) { contextList.AddCustom("get"); contextList.AddCustom("set"); @@ -897,7 +931,7 @@ namespace ICSharpCode.NRefactory.CSharp.Completion IEnumerable DefaultControlSpaceItems(ExpressionResult xp = null, bool controlSpace = true) { - var wrapper = new CompletionDataWrapper (this); + var wrapper = new CompletionDataWrapper(this); if (offset >= document.TextLength) { offset = document.TextLength - 1; } @@ -917,10 +951,11 @@ namespace ICSharpCode.NRefactory.CSharp.Completion rr = ResolveExpression(node, xp.Unit); unit = xp.Unit; } else { - unit = ParseStub("a"); + unit = ParseStub("a", false); node = unit.GetNodeAt(location); rr = ResolveExpression(node, unit); } + if (node is Identifier && node.Parent is ForeachStatement) { var foreachStmt = (ForeachStatement)node.Parent; foreach (var possibleName in GenerateNameProposals (foreachStmt.VariableType)) { @@ -933,7 +968,7 @@ namespace ICSharpCode.NRefactory.CSharp.Completion AutoCompleteEmptyMatch = false; return wrapper.Result; } - + if (node is Identifier && node.Parent is ParameterDeclaration) { if (!controlSpace) { return null; @@ -959,6 +994,13 @@ namespace ICSharpCode.NRefactory.CSharp.Completion return wrapper.Result; } } + + var initializer = node != null ? node.Parent as ArrayInitializerExpression : null; + if (initializer != null) { + var result = HandleObjectInitializer(unit, initializer); + if (result != null) + return result; + } CSharpResolver csResolver = null; if (rr != null) { csResolver = rr.Item2; @@ -1010,11 +1052,11 @@ namespace ICSharpCode.NRefactory.CSharp.Completion } } - Predicate typePred = null; + Func typePred = null; if (IsAttributeContext(node)) { var attribute = Compilation.FindType(KnownTypeCode.Attribute); typePred = t => { - return t.GetAllBaseTypeDefinitions().Any(bt => bt.Equals(attribute)); + return t.GetAllBaseTypeDefinitions().Any(bt => bt.Equals(attribute)) ? t : null; }; } AddTypesAndNamespaces(wrapper, state, node, typePred); @@ -1088,18 +1130,22 @@ namespace ICSharpCode.NRefactory.CSharp.Completion return false; } - void AddTypesAndNamespaces(CompletionDataWrapper wrapper, CSharpResolver state, AstNode node, Predicate typePred = null, Predicate memberPred = null) + void AddTypesAndNamespaces(CompletionDataWrapper wrapper, CSharpResolver state, AstNode node, Func typePred = null, Predicate memberPred = null) { if (currentType != null) { for (var ct = currentType; ct != null; ct = ct.DeclaringTypeDefinition) { foreach (var nestedType in ct.NestedTypes) { - if (typePred == null || typePred(nestedType.Resolve(ctx))) { - string name = nestedType.Name; - if (IsAttributeContext(node) && name.EndsWith("Attribute") && name.Length > "Attribute".Length) { - name = name.Substring(0, name.Length - "Attribute".Length); - } + string name = nestedType.Name; + if (IsAttributeContext(node) && name.EndsWith("Attribute") && name.Length > "Attribute".Length) + name = name.Substring(0, name.Length - "Attribute".Length); + + if (typePred == null) { wrapper.AddType(nestedType, name); + continue; } + + wrapper.AddType(typePred(nestedType.Resolve(ctx)), name); + continue; } } if (this.currentMember != null && !(node is AstType)) { @@ -1142,19 +1188,21 @@ namespace ICSharpCode.NRefactory.CSharp.Completion } foreach (var u in n.Usings) { foreach (var type in u.Types) { - if (typePred == null || typePred(type)) { + IType addType = typePred != null ? typePred(type) : type; + if (addType != null) { string name = type.Name; if (IsAttributeContext(node) && name.EndsWith("Attribute") && name.Length > "Attribute".Length) { name = name.Substring(0, name.Length - "Attribute".Length); } - wrapper.AddType(type, name); + wrapper.AddType(addType, name); } } } foreach (var type in n.Namespace.Types) { - if (typePred == null || typePred(type)) { - wrapper.AddType(type, type.Name); + IType addType = typePred != null ? typePred(type) : type; + if (addType != null) { + wrapper.AddType(addType, addType.Name); } } @@ -1166,7 +1214,14 @@ namespace ICSharpCode.NRefactory.CSharp.Completion IEnumerable HandleKeywordCompletion(int wordStart, string word) { - if (IsInsideCommentOrString()) { + if (IsInsideCommentStringOrDirective()) { + if (IsInPreprocessorDirective()) { + if (word == "if" || word == "elif") { + if (wordStart > 0 && document.GetCharAt(wordStart - 1) == '#') { + return factory.CreatePreProcessorDefinesCompletionData(); + } + } + } return null; } switch (word) { @@ -1176,7 +1231,7 @@ namespace ICSharpCode.NRefactory.CSharp.Completion return null; } var wrapper = new CompletionDataWrapper(this); - AddTypesAndNamespaces(wrapper, GetState(), null, t => false); + AddTypesAndNamespaces(wrapper, GetState(), null, t => null); return wrapper.Result; case "case": return CreateCaseCompletionData(location); @@ -1260,7 +1315,7 @@ namespace ICSharpCode.NRefactory.CSharp.Completion } var isAsWrapper = new CompletionDataWrapper(this); var def = isAsType != null ? isAsType.GetDefinition() : null; - AddTypesAndNamespaces(isAsWrapper, GetState(), null, t => t.GetDefinition() == null || def == null || t.GetDefinition().IsDerivedFrom(def), m => false); + AddTypesAndNamespaces(isAsWrapper, GetState(), null, t => t.GetDefinition() == null || def == null || t.GetDefinition().IsDerivedFrom(def) ? t : null, m => false); return isAsWrapper.Result; // { // CompletionDataList completionList = new ProjectDomCompletionDataList (); @@ -1466,31 +1521,6 @@ namespace ICSharpCode.NRefactory.CSharp.Completion } return CreateTypeCompletionData(hintType, hintTypeAst); -// IType callingType = NRefactoryResolver.GetTypeAtCursor (Document.CompilationUnit, Document.FileName, new TextLocation (document.Caret.Line, document.Caret.Column)); -// ExpressionContext newExactContext = new NewCSharpExpressionFinder (dom).FindExactContextForNewCompletion (document, Document.CompilationUnit, Document.FileName, callingType); -// if (newExactContext is ExpressionContext.TypeExpressionContext) -// return CreateTypeCompletionData (location, callingType, newExactContext, ((ExpressionContext.TypeExpressionContext)newExactContext).Type, ((ExpressionContext.TypeExpressionContext)newExactContext).UnresolvedType); -// if (newExactContext == null) { -// int j = offset - 4; -// -// string yieldToken = GetPreviousToken (ref j, true); -// if (token == "return") { -// NRefactoryResolver resolver = CreateResolver (); -// resolver.SetupResolver (new TextLocation (completionContext.TriggerLine, completionContext.TriggerLineOffset)); -// IReturnType returnType = resolver.CallingMember.ReturnType; -// if (yieldToken == "yield" && returnType.GenericArguments.Count > 0) -// returnType = returnType.GenericArguments [0]; -// if (resolver.CallingMember != null) -// return CreateTypeCompletionData (location, callingType, newExactContext, null, returnType); -// } -// } -// return CreateCtrlSpaceCompletionData (completionContext, null); - case "if": - case "elif": - if (wordStart > 0 && document.GetCharAt(wordStart - 1) == '#') { - return factory.CreatePreProcessorDefinesCompletionData(); - } - return null; case "yield": var yieldDataList = new CompletionDataWrapper(this); DefaultCompletionString = "return"; @@ -1505,38 +1535,7 @@ namespace ICSharpCode.NRefactory.CSharp.Completion AddContextCompletion(inList, rr != null ? rr.Item2 : GetState(), expr.Node, Unit); return inList.Result; -// case "where": -// CompletionDataList whereDataList = new CompletionDataList (); -// NRefactoryResolver constraintResolver = CreateResolver (); -// constraintResolver.SetupResolver (new TextLocation (completionContext.TriggerLine, completionContext.TriggerLineOffset)); -// if (constraintResolver.CallingMember is IMethod) { -// foreach (ITypeParameter tp in ((IMethod)constraintResolver.CallingMember).TypeParameters) { -// whereDataList.Add (tp.Name, "md-keyword"); -// } -// } else { -// if (constraintResolver.CallingType != null) { -// foreach (ITypeParameter tp in constraintResolver.CallingType.TypeParameters) { -// whereDataList.Add (tp.Name, "md-keyword"); -// } -// } -// } -// -// return whereDataList; - } - // if (IsInLinqContext (result)) { - // if (linqKeywords.Contains (word)) { - // if (word == "from") // after from no auto code completion. - // return null; - // result.Expression = ""; - // return CreateCtrlSpaceCompletionData (completionContext, result); - // } - // CompletionDataList dataList = new ProjectDomCompletionDataList (); - // CompletionDataCollector col = new CompletionDataCollector (this, dom, dataList, Document.CompilationUnit, null, new TextLocation (completionContext.TriggerLine, completionContext.TriggerLineOffset)); - // foreach (string kw in linqKeywords) { - // col.Add (kw, "md-keyword"); - // } - // return dataList; - // } + } return null; } @@ -1563,42 +1562,55 @@ namespace ICSharpCode.NRefactory.CSharp.Completion } return ""; } - + static CSharpAmbience amb = new CSharpAmbience (); + IEnumerable CreateTypeCompletionData(IType hintType, AstType hintTypeAst) { - var wrapper = new CompletionDataWrapper (this); + var wrapper = new CompletionDataWrapper(this); var state = GetState(); - Predicate pred = null; + Func pred = null; if (hintType != null) { if (hintType.Kind != TypeKind.Unknown) { - var lookup = new MemberLookup (ctx.CurrentTypeDefinition, Compilation.MainAssembly); + var lookup = new MemberLookup(ctx.CurrentTypeDefinition, Compilation.MainAssembly); pred = t => { // check if type is in inheritance tree. if (hintType.GetDefinition() != null && !t.GetDefinition().IsDerivedFrom(hintType.GetDefinition())) { - return false; + return null; } if (t.Kind == TypeKind.Interface && hintType.Kind != TypeKind.Array) { - return false; + return null; } // check for valid constructors - if (t.GetConstructors().Count() == 0) { - return true; + if (t.GetConstructors().Count() > 0) { + bool isProtectedAllowed = currentType != null ? currentType.Resolve(ctx).GetDefinition().IsDerivedFrom(t.GetDefinition()) : false; + if (!t.GetConstructors().Any(m => lookup.IsAccessible(m, isProtectedAllowed))) + return null; } - bool isProtectedAllowed = currentType != null ? currentType.Resolve(ctx).GetDefinition().IsDerivedFrom(t.GetDefinition()) : false; - return t.GetConstructors().Any(m => lookup.IsAccessible(m, isProtectedAllowed)); + + var typeInference = new TypeInference(Compilation); + typeInference.Algorithm = TypeInferenceAlgorithm.ImprovedReturnAllResults; + var inferedType = typeInference.FindTypeInBounds(new [] { t }, new [] { hintType }); + wrapper.AddType(inferedType, amb.ConvertType(inferedType)); + return null; }; if (!(hintType.Kind == TypeKind.Interface && hintType.Kind != TypeKind.Array)) { DefaultCompletionString = GetShortType(hintType, GetState()); wrapper.AddType(hintType, DefaultCompletionString); } + if (hintType is ParameterizedType && hintType.TypeParameterCount == 1 && hintType.FullName == "System.Collections.Generic.IEnumerable") { + var arg = ((ParameterizedType)hintType).TypeArguments.FirstOrDefault(); + var array = new ArrayTypeReference(arg.ToTypeReference(), 1).Resolve(ctx); + wrapper.AddType(array, amb.ConvertType(array)); + } } else { DefaultCompletionString = hintTypeAst.ToString(); wrapper.AddType(hintType, DefaultCompletionString); } } AddTypesAndNamespaces(wrapper, state, null, pred, m => false); - AddKeywords(wrapper, primitiveTypesKeywords.Where(k => k != "void")); + if (hintType == null || hintType == SpecialType.UnknownType) + AddKeywords(wrapper, primitiveTypesKeywords.Where(k => k != "void")); CloseOnSquareBrackets = true; AutoCompleteEmptyMatch = true; return wrapper.Result; @@ -1712,7 +1724,7 @@ namespace ICSharpCode.NRefactory.CSharp.Completion if (alreadyInserted.Any(cm => SignatureComparer.Ordinal.Equals(cm, m))) continue; alreadyInserted.Add (m); - data.CompletionCategory = col.GetCompletionCategory(curType); + data.CompletionCategory = col.GetCompletionCategory(m.DeclaringTypeDefinition); col.Add(data); } } @@ -1942,9 +1954,9 @@ namespace ICSharpCode.NRefactory.CSharp.Completion IEnumerable CreateParameterCompletion(MethodGroupResolveResult resolveResult, CSharpResolver state, AstNode invocation, CompilationUnit unit, int parameter, bool controlSpace) { - var result = new CompletionDataWrapper (this); - var addedEnums = new HashSet (); - var addedDelegates = new HashSet (); + var result = new CompletionDataWrapper(this); + var addedEnums = new HashSet(); + var addedDelegates = new HashSet(); foreach (var method in resolveResult.Methods) { if (method.Parameters.Count <= parameter) { @@ -1958,13 +1970,11 @@ namespace ICSharpCode.NRefactory.CSharp.Completion addedEnums.Add(resolvedType.ReflectionName); AddEnumMembers(result, resolvedType, state); } else if (resolvedType.Kind == TypeKind.Delegate) { - // if (addedDelegates.Contains (resolvedType.DecoratedFullName)) - // continue; - // addedDelegates.Add (resolvedType.DecoratedFullName); - // string parameterDefinition = AddDelegateHandlers (completionList, resolvedType, false, addedDelegates.Count == 1); - // string varName = "Handle" + method.Parameters [parameter].ReturnType.Name + method.Parameters [parameter].Name; - // result.Add (new EventCreationCompletionData (document, varName, resolvedType, null, parameterDefinition, resolver.Unit.GetMemberAt (location), resolvedType) { AddSemicolon = false }); - + if (addedDelegates.Contains(resolvedType.ReflectionName)) + continue; + string parameterDefinition = AddDelegateHandlers(result, resolvedType); + string varName = "Handle" + method.Parameters [parameter].Type.Name + method.Parameters [parameter].Name; + result.Result.Add(factory.CreateEventCreationCompletionData(varName, resolvedType, null, parameterDefinition, currentMember, currentType)); } } if (!controlSpace) { @@ -2515,132 +2525,7 @@ namespace ICSharpCode.NRefactory.CSharp.Completion return document.GetText(i, endOffset - i); } - - bool GetParameterCompletionCommandOffset(out int cpos) - { - // Start calculating the parameter offset from the beginning of the - // current member, instead of the beginning of the file. - cpos = offset - 1; - var mem = currentMember; - if (mem == null || (mem is IType)) { - return false; - } - int startPos = document.GetOffset(mem.Region.BeginLine, mem.Region.BeginColumn); - int parenDepth = 0; - int chevronDepth = 0; - while (cpos > startPos) { - char c = document.GetCharAt(cpos); - if (c == ')') { - parenDepth++; - } - if (c == '>') { - chevronDepth++; - } - if (parenDepth == 0 && c == '(' || chevronDepth == 0 && c == '<') { - int p = GetCurrentParameterIndex(cpos + 1, startPos); - if (p != -1) { - cpos++; - return true; - } else { - return false; - } - } - if (c == '(') { - parenDepth--; - } - if (c == '<') { - chevronDepth--; - } - cpos--; - } - return false; - } - - int GetCurrentParameterIndex(int offset, int memberStart) - { - int cursor = this.offset; - int i = offset; - - if (i > cursor) { - return -1; - } - if (i == cursor) { - return 1; - } - // parameters are 1 based - int index = memberStart + 1; - int parentheses = 0; - int bracket = 0; - bool insideQuote = false, insideString = false, insideSingleLineComment = false, insideMultiLineComment = false; - do { - char c = document.GetCharAt(i - 1); - switch (c) { - case '\\': - if (insideString || insideQuote) { - i++; - } - break; - case '\'': - if (!insideString && !insideSingleLineComment && !insideMultiLineComment) { - insideQuote = !insideQuote; - } - break; - case '"': - if (!insideQuote && !insideSingleLineComment && !insideMultiLineComment) { - insideString = !insideString; - } - break; - case '/': - if (!insideQuote && !insideString && !insideMultiLineComment) { - if (document.GetCharAt(i) == '/') { - insideSingleLineComment = true; - } - if (document.GetCharAt(i) == '*') { - insideMultiLineComment = true; - } - } - break; - case '*': - if (insideMultiLineComment && document.GetCharAt(i) == '/') { - insideMultiLineComment = false; - } - break; - case '\n': - case '\r': - insideSingleLineComment = false; - break; - case '{': - if (!insideQuote && !insideString && !insideSingleLineComment && !insideMultiLineComment) { - bracket++; - } - break; - case '}': - if (!insideQuote && !insideString && !insideSingleLineComment && !insideMultiLineComment) { - bracket--; - } - break; - case '(': - if (!insideQuote && !insideString && !insideSingleLineComment && !insideMultiLineComment) { - parentheses++; - } - break; - case ')': - if (!insideQuote && !insideString && !insideSingleLineComment && !insideMultiLineComment) { - parentheses--; - } - break; - case ',': - if (!insideQuote && !insideString && !insideSingleLineComment && !insideMultiLineComment && parentheses == 1 && bracket == 0) { - index++; - } - break; - } - i++; - } while (i <= cursor && parentheses >= 0); - - return parentheses != 1 || bracket > 0 ? -1 : index; - } - + #endregion #region Preprocessor diff --git a/src/Libraries/NRefactory/ICSharpCode.NRefactory.CSharp/Completion/CSharpCompletionEngineBase.cs b/src/Libraries/NRefactory/ICSharpCode.NRefactory.CSharp/Completion/CSharpCompletionEngineBase.cs index 3f8f4d04b1..4bfa2f9d46 100644 --- a/src/Libraries/NRefactory/ICSharpCode.NRefactory.CSharp/Completion/CSharpCompletionEngineBase.cs +++ b/src/Libraries/NRefactory/ICSharpCode.NRefactory.CSharp/Completion/CSharpCompletionEngineBase.cs @@ -100,76 +100,258 @@ namespace ICSharpCode.NRefactory.CSharp.Completion var provider = MemberProvider ?? new DefaultMemberProvider (this); provider.GetCurrentMembers (offset, out currentType, out currentMember); } + + protected bool GetParameterCompletionCommandOffset(out int cpos) + { + // Start calculating the parameter offset from the beginning of the + // current member, instead of the beginning of the file. + cpos = offset - 1; + var mem = currentMember; + if (mem == null || (mem is IType)) { + return false; + } + int startPos = document.GetOffset(mem.Region.BeginLine, mem.Region.BeginColumn); + int parenDepth = 0; + int chevronDepth = 0; + Stack indexStack = new Stack(); + while (cpos > startPos) { + char c = document.GetCharAt(cpos); + if (c == ')') { + parenDepth++; + } + if (c == '>') { + chevronDepth++; + } + if (c == '}') { + if (indexStack.Count > 0) { + parenDepth = indexStack.Pop(); + } else { + parenDepth = 0; + } + chevronDepth = 0; + } + if (indexStack.Count == 0 && (parenDepth == 0 && c == '(' || chevronDepth == 0 && c == '<')) { + int p = GetCurrentParameterIndex (cpos + 1, startPos); + if (p != -1) { + cpos++; + return true; + } else { + return false; + } + } + if (c == '(') { + parenDepth--; + } + if (c == '<') { + chevronDepth--; + } + if (c == '{') { + indexStack.Push (parenDepth); + chevronDepth = 0; + } + cpos--; + } + return false; + } - #region Context helper methods - protected bool IsInsideCommentOrString () + protected int GetCurrentParameterIndex (int offset, int memberStart) { - var text = GetMemberTextToCaret (); - bool inSingleComment = false, inString = false, inVerbatimString = false, inChar = false, inMultiLineComment = false; + int cursor = this.offset; + int i = offset; - for (int i = 0; i < text.Item1.Length - 1; i++) { - char ch = text.Item1 [i]; - char nextCh = text.Item1 [i + 1]; - - switch (ch) { - case '/': - if (inString || inChar || inVerbatimString) - break; - if (nextCh == '/') { + if (i > cursor) { + return -1; + } + if (i == cursor) { + return 1; + } + // parameters are 1 based + int index = memberStart + 1; + int parentheses = 0; + int bracket = 0; + bool insideQuote = false, insideString = false, insideSingleLineComment = false, insideMultiLineComment = false; + Stack indexStack = new Stack (); + do { + char c = document.GetCharAt (i - 1); + switch (c) { + case '\\': + if (insideString || insideQuote) { i++; - inSingleComment = true; } - if (nextCh == '*') - inMultiLineComment = true; break; - case '*': - if (inString || inChar || inVerbatimString || inSingleComment) - break; - if (nextCh == '/') { - i++; - inMultiLineComment = false; + case '\'': + if (!insideString && !insideSingleLineComment && !insideMultiLineComment) { + insideQuote = !insideQuote; } break; - case '@': - if (inString || inChar || inVerbatimString || inSingleComment || inMultiLineComment) - break; - if (nextCh == '"') { - i++; - inVerbatimString = true; + case '"': + if (!insideQuote && !insideSingleLineComment && !insideMultiLineComment) { + insideString = !insideString; + } + break; + case '/': + if (!insideQuote && !insideString && !insideMultiLineComment) { + if (document.GetCharAt (i) == '/') { + insideSingleLineComment = true; + } + if (document.GetCharAt (i) == '*') { + insideMultiLineComment = true; + } + } + break; + case '*': + if (insideMultiLineComment && document.GetCharAt (i) == '/') { + insideMultiLineComment = false; } break; case '\n': case '\r': - inSingleComment = false; - inString = false; - inChar = false; + insideSingleLineComment = false; break; - case '\\': - if (inString || inChar) - i++; + case '{': + if (!insideQuote && !insideString && !insideSingleLineComment && !insideMultiLineComment) { + bracket++; + indexStack.Push (index); + } break; - case '"': - if (inSingleComment || inMultiLineComment || inChar) - break; - if (inVerbatimString) { - if (nextCh == '"') { - i++; - break; - } - inVerbatimString = false; - break; + case '}': + if (!insideQuote && !insideString && !insideSingleLineComment && !insideMultiLineComment) { + bracket--; + if (indexStack.Count > 0) + index = indexStack.Pop (); } - inString = !inString; break; - case '\'': - if (inSingleComment || inMultiLineComment || inString || inVerbatimString) - break; - inChar = !inChar; + case '(': + if (!insideQuote && !insideString && !insideSingleLineComment && !insideMultiLineComment) { + parentheses++; + } + break; + case ')': + if (!insideQuote && !insideString && !insideSingleLineComment && !insideMultiLineComment) { + parentheses--; + } + break; + case ',': + if (!insideQuote && !insideString && !insideSingleLineComment && !insideMultiLineComment && parentheses == 1 && bracket == 0) { + index++; + } break; + + } + i++; + } while (i <= cursor && parentheses >= 0); + Console.WriteLine (indexStack.Count >= 0 || parentheses != 1 || bracket > 0 ? -1 : index); + return indexStack.Count >= 0 || parentheses != 1 || bracket > 0 ? -1 : index; + } + + #region Context helper methods + public class MiniLexer + { + readonly string text; + + public bool IsFistNonWs = true; + public bool IsInSingleComment = false; + public bool IsInString = false; + public bool IsInVerbatimString = false; + public bool IsInChar = false; + public bool IsInMultiLineComment = false; + public bool IsInPreprocessorDirective = false; + + public MiniLexer(string text) + { + this.text = text; + } + + public void Parse(Action act = null) + { + Parse(0, text.Length, act); + } + + public void Parse(int start, int length, Action act = null) + { + for (int i = start; i < length; i++) { + char ch = text [i]; + char nextCh = i + 1 < text.Length ? text [i + 1] : '\0'; + switch (ch) { + case '#': + if (IsFistNonWs) + IsInPreprocessorDirective = true; + break; + case '/': + if (IsInString || IsInChar || IsInVerbatimString) + break; + if (nextCh == '/') { + i++; + IsInSingleComment = true; + } + if (nextCh == '*') + IsInMultiLineComment = true; + break; + case '*': + if (IsInString || IsInChar || IsInVerbatimString || IsInSingleComment) + break; + if (nextCh == '/') { + i++; + IsInMultiLineComment = false; + } + break; + case '@': + if (IsInString || IsInChar || IsInVerbatimString || IsInSingleComment || IsInMultiLineComment) + break; + if (nextCh == '"') { + i++; + IsInVerbatimString = true; + } + break; + case '\n': + case '\r': + IsInSingleComment = false; + IsInString = false; + IsInChar = false; + IsFistNonWs = true; + break; + case '\\': + if (IsInString || IsInChar) + i++; + break; + case '"': + if (IsInSingleComment || IsInMultiLineComment || IsInChar) + break; + if (IsInVerbatimString) { + if (nextCh == '"') { + i++; + break; + } + IsInVerbatimString = false; + break; + } + IsInString = !IsInString; + break; + case '\'': + if (IsInSingleComment || IsInMultiLineComment || IsInString || IsInVerbatimString) + break; + IsInChar = !IsInChar; + break; + } + if (act != null) + act(ch); + IsFistNonWs &= ch == ' ' || ch == '\t' || ch == '\n' || ch == '\r'; } } - - return inSingleComment || inString || inVerbatimString || inChar || inMultiLineComment; + } + + protected bool IsInsideCommentStringOrDirective() + { + var text = GetMemberTextToCaret(); + var lexer = new MiniLexer(text.Item1); + lexer.Parse(); + return + lexer.IsInSingleComment || + lexer.IsInString || + lexer.IsInVerbatimString || + lexer.IsInChar || + lexer.IsInMultiLineComment || + lexer.IsInPreprocessorDirective; } protected bool IsInsideDocComment () @@ -439,7 +621,7 @@ namespace ICSharpCode.NRefactory.CSharp.Completion AppendMissingClosingBrackets(wrapper, memberText, appendSemicolon); wrapper.Append(afterContinuation); if (closingBrackets > 0) { - wrapper.Append(new string ('}', closingBrackets)); + wrapper.Append(new string('}', closingBrackets)); } using (var stream = new System.IO.StringReader (wrapper.ToString ())) { try { diff --git a/src/Libraries/NRefactory/ICSharpCode.NRefactory.CSharp/Completion/CSharpParameterCompletionEngine.cs b/src/Libraries/NRefactory/ICSharpCode.NRefactory.CSharp/Completion/CSharpParameterCompletionEngine.cs index ebdda33f09..76c266244c 100644 --- a/src/Libraries/NRefactory/ICSharpCode.NRefactory.CSharp/Completion/CSharpParameterCompletionEngine.cs +++ b/src/Libraries/NRefactory/ICSharpCode.NRefactory.CSharp/Completion/CSharpParameterCompletionEngine.cs @@ -1,4 +1,4 @@ -// +// // CSharpParameterCompletionEngine.cs // // Author: @@ -105,6 +105,8 @@ namespace ICSharpCode.NRefactory.CSharp.Completion //var memberLocation = currentMember != null ? currentMember.Region.Begin : currentType.Region.Begin; var expr = baseUnit.GetNodeAt(location.Line, location.Column + 1); + if (expr == null) + return null; // '>' position return new ExpressionResult((AstNode)expr, baseUnit); } @@ -146,7 +148,7 @@ namespace ICSharpCode.NRefactory.CSharp.Completion } SetOffset(offset); - if (IsInsideCommentOrString()) { + if (IsInsideCommentStringOrDirective()) { return null; } @@ -171,6 +173,8 @@ namespace ICSharpCode.NRefactory.CSharp.Completion } if (invoke.Node is ObjectCreateExpression) { var createType = ResolveExpression(((ObjectCreateExpression)invoke.Node).Type, invoke.Unit); + if (createType.Item1.Type.Kind == TypeKind.Unknown) + return null; return factory.CreateConstructorProvider(document.GetOffset(invoke.Node.StartLocation), createType.Item1.Type); } @@ -217,6 +221,8 @@ namespace ICSharpCode.NRefactory.CSharp.Completion if (invoke == null) { invoke = GetTypeBeforeCursor(); if (invoke != null) { + if (GetCurrentParameterIndex(document.GetOffset(invoke.Node.StartLocation), offset) < 0) + return null; var typeExpression = ResolveExpression(invoke); if (typeExpression == null || typeExpression.Item1 == null || typeExpression.Item1.IsError) { return null; @@ -226,6 +232,8 @@ namespace ICSharpCode.NRefactory.CSharp.Completion } return null; } + if (GetCurrentParameterIndex(document.GetOffset(invoke.Node.StartLocation), offset) < 0) + return null; if (invoke.Node is ObjectCreateExpression) { var createType = ResolveExpression(((ObjectCreateExpression)invoke.Node).Type, invoke.Unit); return factory.CreateConstructorProvider(document.GetOffset(invoke.Node.StartLocation), createType.Item1.Type); @@ -334,17 +342,37 @@ namespace ICSharpCode.NRefactory.CSharp.Completion return 0; } var parameter = new Stack(); + var bracketStack = new Stack>(); bool inSingleComment = false, inString = false, inVerbatimString = false, inChar = false, inMultiLineComment = false; for (int i = triggerOffset; i < endOffset; i++) { char ch = document.GetCharAt(i); char nextCh = i + 1 < document.TextLength ? document.GetCharAt(i + 1) : '\0'; switch (ch) { + case '{': + if (inString || inChar || inVerbatimString || inSingleComment || inMultiLineComment) { + break; + } + bracketStack.Push(parameter); + parameter = new Stack(); + break; + case '[': case '(': if (inString || inChar || inVerbatimString || inSingleComment || inMultiLineComment) { break; } parameter.Push(0); break; + case '}': + if (inString || inChar || inVerbatimString || inSingleComment || inMultiLineComment) { + break; + } + if (bracketStack.Count > 0) { + parameter = bracketStack.Pop(); + } else { + return -1; + } + break; + case ']': case ')': if (inString || inChar || inVerbatimString || inSingleComment || inMultiLineComment) { break; @@ -440,51 +468,11 @@ namespace ICSharpCode.NRefactory.CSharp.Completion break; } } - if (parameter.Count == 0) { + if (parameter.Count == 0 || bracketStack.Count > 0) { return -1; } return parameter.Pop() + 1; } - - - /* - public override bool GetParameterCompletionCommandOffset (out int cpos) - { - // Start calculating the parameter offset from the beginning of the - // current member, instead of the beginning of the file. - cpos = textEditorData.Caret.Offset - 1; - var parsedDocument = Document.ParsedDocument; - if (parsedDocument == null) - return false; - IMember mem = currentMember; - if (mem == null || (mem is IType)) - return false; - int startPos = textEditorData.LocationToOffset (mem.Region.BeginLine, mem.Region.BeginColumn); - int parenDepth = 0; - int chevronDepth = 0; - while (cpos > startPos) { - char c = textEditorData.GetCharAt (cpos); - if (c == ')') - parenDepth++; - if (c == '>') - chevronDepth++; - if (parenDepth == 0 && c == '(' || chevronDepth == 0 && c == '<') { - int p = MethodParameterDataProvider.GetCurrentParameterIndex (CompletionWidget, cpos + 1, startPos); - if (p != -1) { - cpos++; - return true; - } else { - return false; - } - } - if (c == '(') - parenDepth--; - if (c == '<') - chevronDepth--; - cpos--; - } - return false; - }*/ } } diff --git a/src/Libraries/NRefactory/ICSharpCode.NRefactory.CSharp/Formatter/AstFormattingVisitor.cs b/src/Libraries/NRefactory/ICSharpCode.NRefactory.CSharp/Formatter/AstFormattingVisitor.cs index 76bb49ffd0..a47de80581 100644 --- a/src/Libraries/NRefactory/ICSharpCode.NRefactory.CSharp/Formatter/AstFormattingVisitor.cs +++ b/src/Libraries/NRefactory/ICSharpCode.NRefactory.CSharp/Formatter/AstFormattingVisitor.cs @@ -1,4 +1,4 @@ -// +// // AstFormattingVisitor.cs // // Author: @@ -445,6 +445,24 @@ namespace ICSharpCode.NRefactory.CSharp return i; } + int ForceSpacesBeforeRemoveNewLines(AstNode n) + { + if (n == null || n.IsNull) { + return 0; + } + int offset = document.GetOffset(n.StartLocation); + int i = offset - 1; + while (i >= 0) { + char ch = document.GetCharAt(i); + if (!IsSpacing(ch) && ch != '\r' && ch != '\n') + break; + i--; + } + var length = System.Math.Max(0, (offset - 1) - i); + AddChange(i + 1, length, " "); + return i; + } + public override void VisitPropertyDeclaration(PropertyDeclaration propertyDeclaration) { FormatAttributedNode(propertyDeclaration); @@ -870,8 +888,16 @@ namespace ICSharpCode.NRefactory.CSharp if (child.Role == Roles.LBrace || child.Role == Roles.RBrace) { continue; } - FixStatementIndentation(child.StartLocation); - child.AcceptVisitor(this); + if (child is Statement) { + FixStatementIndentation(child.StartLocation); + child.AcceptVisitor(this); + } else if (child is Comment) { + child.AcceptVisitor(this); + } else { + // pre processor directives at line start, if they are there. + if (child.StartLocation.Column > 1) + FixStatementIndentation(child.StartLocation); + } } if (indent) { curIndent.Pop (); @@ -887,7 +913,7 @@ namespace ICSharpCode.NRefactory.CSharp public override void VisitComment(Comment comment) { - if (comment.StartsLine && !HadErrors && comment.StartLocation.Column > 1) { + if (comment.StartsLine && !HadErrors && (!policy.KeepCommentsAtFirstColumn || comment.StartLocation.Column > 1)) { FixIndentation(comment.StartLocation); } } @@ -1404,18 +1430,11 @@ namespace ICSharpCode.NRefactory.CSharp } var lastLoc = variableDeclarationStatement.StartLocation; foreach (var initializer in variableDeclarationStatement.Variables) { - var indent = !(initializer.Initializer is AnonymousMethodExpression); - if (indent) { - curIndent.Push(IndentType.Block); - } if (lastLoc.Line != initializer.StartLocation.Line) { FixStatementIndentation(initializer.StartLocation); lastLoc = initializer.StartLocation; } initializer.AcceptVisitor(this); - if (indent) { - curIndent.Pop (); - } } FormatCommas(variableDeclarationStatement, policy.SpaceBeforeLocalVariableDeclarationComma, policy.SpaceAfterLocalVariableDeclarationComma); @@ -1673,6 +1692,28 @@ namespace ICSharpCode.NRefactory.CSharp base.VisitArrayCreateExpression(arrayObjectCreateExpression); } + public override void VisitArrayInitializerExpression(ArrayInitializerExpression arrayInitializerExpression) + { + if (policy.ArrayInitializerWrapping == Wrapping.WrapAlways) { + EnforceBraceStyle(policy.ArrayInitializerBraceStyle, arrayInitializerExpression.LBraceToken, arrayInitializerExpression.RBraceToken); + curIndent.Push(IndentType.Block); + foreach (var init in arrayInitializerExpression.Elements) { + FixStatementIndentation(init.StartLocation); + init.AcceptVisitor(this); + } + curIndent.Pop(); + } else if (policy.ArrayInitializerWrapping == Wrapping.DoNotWrap) { + ForceSpacesBeforeRemoveNewLines(arrayInitializerExpression.LBraceToken); + ForceSpacesBeforeRemoveNewLines(arrayInitializerExpression.RBraceToken); + foreach (var init in arrayInitializerExpression.Elements) { + ForceSpacesBeforeRemoveNewLines(init); + init.AcceptVisitor(this); + } + } else { + base.VisitArrayInitializerExpression(arrayInitializerExpression); + } + } + public override void VisitLambdaExpression(LambdaExpression lambdaExpression) { ForceSpacesAfter(lambdaExpression.ArrowToken, true); @@ -1681,6 +1722,12 @@ namespace ICSharpCode.NRefactory.CSharp base.VisitLambdaExpression(lambdaExpression); } + public override void VisitNamedArgumentExpression(NamedArgumentExpression namedArgumentExpression) + { + ForceSpacesAfter(namedArgumentExpression.ColonToken, policy.SpaceInNamedArgumentAfterDoubleColon); + base.VisitNamedArgumentExpression(namedArgumentExpression); + } + #endregion void ForceSpaceBefore(int offset, bool forceSpace) diff --git a/src/Libraries/NRefactory/ICSharpCode.NRefactory.CSharp/Formatter/CSharpFormattingOptions.cs b/src/Libraries/NRefactory/ICSharpCode.NRefactory.CSharp/Formatter/CSharpFormattingOptions.cs index fa7e244166..0cf8d42a0e 100644 --- a/src/Libraries/NRefactory/ICSharpCode.NRefactory.CSharp/Formatter/CSharpFormattingOptions.cs +++ b/src/Libraries/NRefactory/ICSharpCode.NRefactory.CSharp/Formatter/CSharpFormattingOptions.cs @@ -48,12 +48,6 @@ namespace ICSharpCode.NRefactory.CSharp AddBraces } - public enum ArrayInitializerPlacement - { - AlwaysNewLine, - AlwaysSameLine - } - public enum PropertyFormatting { AllowOneLine, @@ -61,6 +55,12 @@ namespace ICSharpCode.NRefactory.CSharp ForceNewLine } + public enum Wrapping { + DoNotWrap, + WrapAlways, + WrapIfTooLong + } + public class CSharpFormattingOptions { public string Name { @@ -322,11 +322,6 @@ namespace ICSharpCode.NRefactory.CSharp get; set; } - - public ArrayInitializerPlacement PlaceArrayInitializersOnNewLine { - get; - set; - } #endregion #region Spaces @@ -727,6 +722,10 @@ namespace ICSharpCode.NRefactory.CSharp set; } + public bool SpaceInNamedArgumentAfterDoubleColon { + get; + set; + } #endregion #region Blank Lines @@ -766,119 +765,31 @@ namespace ICSharpCode.NRefactory.CSharp } #endregion - - public CSharpFormattingOptions () + + + #region Keep formatting + public bool KeepCommentsAtFirstColumn { + get; + set; + } + #endregion + + #region Wrapping + + public Wrapping ArrayInitializerWrapping { + get; + set; + } + + public BraceStyle ArrayInitializerBraceStyle { + get; + set; + } + + #endregion + + internal CSharpFormattingOptions() { - IndentNamespaceBody = true; - IndentClassBody = IndentInterfaceBody = IndentStructBody = IndentEnumBody = true; - IndentMethodBody = IndentPropertyBody = IndentEventBody = true; - IndentBlocks = true; - IndentSwitchBody = false; - IndentCaseBody = true; - IndentBreakStatements = true; - NamespaceBraceStyle = BraceStyle.NextLine; - ClassBraceStyle = InterfaceBraceStyle = StructBraceStyle = EnumBraceStyle = BraceStyle.NextLine; - MethodBraceStyle = ConstructorBraceStyle = DestructorBraceStyle = BraceStyle.NextLine; - AnonymousMethodBraceStyle = BraceStyle.EndOfLine; - - PropertyBraceStyle = PropertyGetBraceStyle = PropertySetBraceStyle = BraceStyle.EndOfLine; - AllowPropertyGetBlockInline = AllowPropertySetBlockInline = true; - - EventBraceStyle = EventAddBraceStyle = EventRemoveBraceStyle = BraceStyle.EndOfLine; - AllowEventAddBlockInline = AllowEventRemoveBlockInline = true; - StatementBraceStyle = BraceStyle.EndOfLine; - - PlaceElseOnNewLine = false; - PlaceCatchOnNewLine = false; - PlaceFinallyOnNewLine = false; - PlaceWhileOnNewLine = false; - PlaceArrayInitializersOnNewLine = ArrayInitializerPlacement.AlwaysSameLine; - - SpaceBeforeMethodCallParentheses = true; - SpaceBeforeMethodDeclarationParentheses = true; - SpaceBeforeConstructorDeclarationParentheses = true; - SpaceBeforeDelegateDeclarationParentheses = true; - SpaceAfterMethodCallParameterComma = true; - SpaceAfterConstructorDeclarationParameterComma = true; - - SpaceBeforeNewParentheses = true; - SpacesWithinNewParentheses = false; - SpacesBetweenEmptyNewParentheses = false; - SpaceBeforeNewParameterComma = false; - SpaceAfterNewParameterComma = true; - - SpaceBeforeIfParentheses = true; - SpaceBeforeWhileParentheses = true; - SpaceBeforeForParentheses = true; - SpaceBeforeForeachParentheses = true; - SpaceBeforeCatchParentheses = true; - SpaceBeforeSwitchParentheses = true; - SpaceBeforeLockParentheses = true; - SpaceBeforeUsingParentheses = true; - SpaceAroundAssignment = true; - SpaceAroundLogicalOperator = true; - SpaceAroundEqualityOperator = true; - SpaceAroundRelationalOperator = true; - SpaceAroundBitwiseOperator = true; - SpaceAroundAdditiveOperator = true; - SpaceAroundMultiplicativeOperator = true; - SpaceAroundShiftOperator = true; - SpaceAroundNullCoalescingOperator = true; - SpacesWithinParentheses = false; - SpaceWithinMethodCallParentheses = false; - SpaceWithinMethodDeclarationParentheses = false; - SpacesWithinIfParentheses = false; - SpacesWithinWhileParentheses = false; - SpacesWithinForParentheses = false; - SpacesWithinForeachParentheses = false; - SpacesWithinCatchParentheses = false; - SpacesWithinSwitchParentheses = false; - SpacesWithinLockParentheses = false; - SpacesWithinUsingParentheses = false; - SpacesWithinCastParentheses = false; - SpacesWithinSizeOfParentheses = false; - SpacesWithinTypeOfParentheses = false; - SpacesWithinCheckedExpressionParantheses = false; - SpaceBeforeConditionalOperatorCondition = true; - SpaceAfterConditionalOperatorCondition = true; - SpaceBeforeConditionalOperatorSeparator = true; - SpaceAfterConditionalOperatorSeparator = true; - - SpacesWithinBrackets = false; - SpacesBeforeBrackets = true; - SpaceBeforeBracketComma = false; - SpaceAfterBracketComma = true; - - SpaceBeforeForSemicolon = false; - SpaceAfterForSemicolon = true; - SpaceAfterTypecast = false; - - AlignEmbeddedIfStatements = true; - AlignEmbeddedUsingStatements = true; - PropertyFormatting = PropertyFormatting.AllowOneLine; - SpaceBeforeMethodDeclarationParameterComma = false; - SpaceAfterMethodDeclarationParameterComma = true; - SpaceBeforeFieldDeclarationComma = false; - SpaceAfterFieldDeclarationComma = true; - SpaceBeforeLocalVariableDeclarationComma = false; - SpaceAfterLocalVariableDeclarationComma = true; - - SpaceBeforeIndexerDeclarationBracket = true; - SpaceWithinIndexerDeclarationBracket = false; - SpaceBeforeIndexerDeclarationParameterComma = false; - - - SpaceAfterIndexerDeclarationParameterComma = true; - - BlankLinesBeforeUsings = 0; - BlankLinesAfterUsings = 1; - - - BlankLinesBeforeFirstDeclaration = 0; - BlankLinesBetweenTypes = 1; - BlankLinesBetweenFields = 0; - BlankLinesBetweenEventFields = 0; - BlankLinesBetweenMembers = 1; } /*public static CSharpFormattingOptions Load (FilePath selectedFile) @@ -890,7 +801,7 @@ namespace ICSharpCode.NRefactory.CSharp public static CSharpFormattingOptions Load (System.IO.Stream input) { - CSharpFormattingOptions result = new CSharpFormattingOptions (); + CSharpFormattingOptions result = FormattingOptionsFactory.CreateMonoOptions (); result.Name = "noname"; using (XmlTextReader reader = new XmlTextReader (input)) { while (reader.Read ()) { diff --git a/src/Libraries/NRefactory/ICSharpCode.NRefactory.CSharp/Formatter/FormattingOptionsFactory.cs b/src/Libraries/NRefactory/ICSharpCode.NRefactory.CSharp/Formatter/FormattingOptionsFactory.cs new file mode 100644 index 0000000000..331a1579cc --- /dev/null +++ b/src/Libraries/NRefactory/ICSharpCode.NRefactory.CSharp/Formatter/FormattingOptionsFactory.cs @@ -0,0 +1,339 @@ +// +// FormattingOptionsFactory.cs +// +// Author: +// Mike Krüger +// +// Copyright (c) 2012 Xamarin Inc. (http://xamarin.com) +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. +using System; + +namespace ICSharpCode.NRefactory.CSharp +{ + /// + /// The formatting options factory creates pre defined formatting option styles. + /// + public static class FormattingOptionsFactory + { + /// + /// Creates empty CSharpFormatting options. + /// + public static CSharpFormattingOptions CreateEmpty() + { + return new CSharpFormattingOptions(); + } + + /// + /// Creates mono indent style CSharpFormatting options. + /// + public static CSharpFormattingOptions CreateMono() + { + return new CSharpFormattingOptions() { + IndentNamespaceBody = true, + IndentClassBody = true, + IndentInterfaceBody = true, + IndentStructBody = true, + IndentEnumBody = true, + IndentMethodBody = true, + IndentPropertyBody = true, + IndentEventBody = true, + IndentBlocks = true, + IndentSwitchBody = false, + IndentCaseBody = true, + IndentBreakStatements = true, + NamespaceBraceStyle = BraceStyle.NextLine, + ClassBraceStyle = BraceStyle.NextLine, + InterfaceBraceStyle = BraceStyle.NextLine, + StructBraceStyle = BraceStyle.NextLine, + EnumBraceStyle = BraceStyle.NextLine, + MethodBraceStyle = BraceStyle.NextLine, + ConstructorBraceStyle = BraceStyle.NextLine, + DestructorBraceStyle = BraceStyle.NextLine, + AnonymousMethodBraceStyle = BraceStyle.EndOfLine, + + PropertyBraceStyle = BraceStyle.EndOfLine, + PropertyGetBraceStyle = BraceStyle.EndOfLine, + PropertySetBraceStyle = BraceStyle.EndOfLine, + AllowPropertyGetBlockInline = true, + AllowPropertySetBlockInline = true, + + EventBraceStyle = BraceStyle.EndOfLine, + EventAddBraceStyle = BraceStyle.EndOfLine, + EventRemoveBraceStyle = BraceStyle.EndOfLine, + AllowEventAddBlockInline = true, + AllowEventRemoveBlockInline = true, + StatementBraceStyle = BraceStyle.EndOfLine, + + PlaceElseOnNewLine = false, + PlaceCatchOnNewLine = false, + PlaceFinallyOnNewLine = false, + PlaceWhileOnNewLine = false, + ArrayInitializerWrapping = Wrapping.WrapIfTooLong, + ArrayInitializerBraceStyle = BraceStyle.EndOfLine, + + SpaceBeforeMethodCallParentheses = true, + SpaceBeforeMethodDeclarationParentheses = true, + SpaceBeforeConstructorDeclarationParentheses = true, + SpaceBeforeDelegateDeclarationParentheses = true, + SpaceAfterMethodCallParameterComma = true, + SpaceAfterConstructorDeclarationParameterComma = true, + + SpaceBeforeNewParentheses = true, + SpacesWithinNewParentheses = false, + SpacesBetweenEmptyNewParentheses = false, + SpaceBeforeNewParameterComma = false, + SpaceAfterNewParameterComma = true, + + SpaceBeforeIfParentheses = true, + SpaceBeforeWhileParentheses = true, + SpaceBeforeForParentheses = true, + SpaceBeforeForeachParentheses = true, + SpaceBeforeCatchParentheses = true, + SpaceBeforeSwitchParentheses = true, + SpaceBeforeLockParentheses = true, + SpaceBeforeUsingParentheses = true, + SpaceAroundAssignment = true, + SpaceAroundLogicalOperator = true, + SpaceAroundEqualityOperator = true, + SpaceAroundRelationalOperator = true, + SpaceAroundBitwiseOperator = true, + SpaceAroundAdditiveOperator = true, + SpaceAroundMultiplicativeOperator = true, + SpaceAroundShiftOperator = true, + SpaceAroundNullCoalescingOperator = true, + SpacesWithinParentheses = false, + SpaceWithinMethodCallParentheses = false, + SpaceWithinMethodDeclarationParentheses = false, + SpacesWithinIfParentheses = false, + SpacesWithinWhileParentheses = false, + SpacesWithinForParentheses = false, + SpacesWithinForeachParentheses = false, + SpacesWithinCatchParentheses = false, + SpacesWithinSwitchParentheses = false, + SpacesWithinLockParentheses = false, + SpacesWithinUsingParentheses = false, + SpacesWithinCastParentheses = false, + SpacesWithinSizeOfParentheses = false, + SpacesWithinTypeOfParentheses = false, + SpacesWithinCheckedExpressionParantheses = false, + SpaceBeforeConditionalOperatorCondition = true, + SpaceAfterConditionalOperatorCondition = true, + SpaceBeforeConditionalOperatorSeparator = true, + SpaceAfterConditionalOperatorSeparator = true, + + SpacesWithinBrackets = false, + SpacesBeforeBrackets = true, + SpaceBeforeBracketComma = false, + SpaceAfterBracketComma = true, + + SpaceBeforeForSemicolon = false, + SpaceAfterForSemicolon = true, + SpaceAfterTypecast = false, + + AlignEmbeddedIfStatements = true, + AlignEmbeddedUsingStatements = true, + PropertyFormatting = PropertyFormatting.AllowOneLine, + SpaceBeforeMethodDeclarationParameterComma = false, + SpaceAfterMethodDeclarationParameterComma = true, + SpaceBeforeFieldDeclarationComma = false, + SpaceAfterFieldDeclarationComma = true, + SpaceBeforeLocalVariableDeclarationComma = false, + SpaceAfterLocalVariableDeclarationComma = true, + + SpaceBeforeIndexerDeclarationBracket = true, + SpaceWithinIndexerDeclarationBracket = false, + SpaceBeforeIndexerDeclarationParameterComma = false, + SpaceInNamedArgumentAfterDoubleColon = true, + + SpaceAfterIndexerDeclarationParameterComma = true, + + BlankLinesBeforeUsings = 0, + BlankLinesAfterUsings = 1, + + + BlankLinesBeforeFirstDeclaration = 0, + BlankLinesBetweenTypes = 1, + BlankLinesBetweenFields = 0, + BlankLinesBetweenEventFields = 0, + BlankLinesBetweenMembers = 1, + + KeepCommentsAtFirstColumn = true, + }; + } + + /// + /// Creates sharp develop indent style CSharpFormatting options. + /// + public static CSharpFormattingOptions CreateSharpDevelop() + { + return new CSharpFormattingOptions() { + IndentNamespaceBody = true, + IndentClassBody = true, + IndentInterfaceBody = true, + IndentStructBody = true, + IndentEnumBody = true, + IndentMethodBody = true, + IndentPropertyBody = true, + IndentEventBody = true, + IndentBlocks = true, + IndentSwitchBody = true, + IndentCaseBody = true, + IndentBreakStatements = true, + + NamespaceBraceStyle = BraceStyle.NextLine, + ClassBraceStyle = BraceStyle.NextLine, + InterfaceBraceStyle = BraceStyle.NextLine, + StructBraceStyle = BraceStyle.NextLine, + EnumBraceStyle = BraceStyle.NextLine, + MethodBraceStyle = BraceStyle.NextLine, + ConstructorBraceStyle = BraceStyle.NextLine, + DestructorBraceStyle = BraceStyle.NextLine, + AnonymousMethodBraceStyle = BraceStyle.EndOfLine, + PropertyBraceStyle = BraceStyle.EndOfLine, + PropertyGetBraceStyle = BraceStyle.EndOfLine, + PropertySetBraceStyle = BraceStyle.EndOfLine, + AllowPropertyGetBlockInline = true, + AllowPropertySetBlockInline = true, + + EventBraceStyle = BraceStyle.EndOfLine, + EventAddBraceStyle = BraceStyle.EndOfLine, + EventRemoveBraceStyle = BraceStyle.EndOfLine, + AllowEventAddBlockInline = true, + AllowEventRemoveBlockInline = true, + StatementBraceStyle = BraceStyle.EndOfLine, + + PlaceElseOnNewLine = false, + PlaceCatchOnNewLine = false, + PlaceFinallyOnNewLine = false, + PlaceWhileOnNewLine = false, + ArrayInitializerWrapping = Wrapping.WrapIfTooLong, + ArrayInitializerBraceStyle = BraceStyle.EndOfLine, + + SpaceBeforeMethodCallParentheses = false, + SpaceBeforeMethodDeclarationParentheses = false, + SpaceBeforeConstructorDeclarationParentheses = false, + SpaceBeforeDelegateDeclarationParentheses = false, + SpaceAfterMethodCallParameterComma = true, + SpaceAfterConstructorDeclarationParameterComma = true, + + SpaceBeforeNewParentheses = false, + SpacesWithinNewParentheses = false, + SpacesBetweenEmptyNewParentheses = false, + SpaceBeforeNewParameterComma = false, + SpaceAfterNewParameterComma = true, + + SpaceBeforeIfParentheses = true, + SpaceBeforeWhileParentheses = true, + SpaceBeforeForParentheses = true, + SpaceBeforeForeachParentheses = true, + SpaceBeforeCatchParentheses = true, + SpaceBeforeSwitchParentheses = true, + SpaceBeforeLockParentheses = true, + SpaceBeforeUsingParentheses = true, + + SpaceAroundAssignment = true, + SpaceAroundLogicalOperator = true, + SpaceAroundEqualityOperator = true, + SpaceAroundRelationalOperator = true, + SpaceAroundBitwiseOperator = true, + SpaceAroundAdditiveOperator = true, + SpaceAroundMultiplicativeOperator = true, + SpaceAroundShiftOperator = true, + SpaceAroundNullCoalescingOperator = true, + SpacesWithinParentheses = false, + SpaceWithinMethodCallParentheses = false, + SpaceWithinMethodDeclarationParentheses = false, + SpacesWithinIfParentheses = false, + SpacesWithinWhileParentheses = false, + SpacesWithinForParentheses = false, + SpacesWithinForeachParentheses = false, + SpacesWithinCatchParentheses = false, + SpacesWithinSwitchParentheses = false, + SpacesWithinLockParentheses = false, + SpacesWithinUsingParentheses = false, + SpacesWithinCastParentheses = false, + SpacesWithinSizeOfParentheses = false, + SpacesWithinTypeOfParentheses = false, + SpacesWithinCheckedExpressionParantheses = false, + SpaceBeforeConditionalOperatorCondition = true, + SpaceAfterConditionalOperatorCondition = true, + SpaceBeforeConditionalOperatorSeparator = true, + SpaceAfterConditionalOperatorSeparator = true, + + SpacesWithinBrackets = false, + SpacesBeforeBrackets = true, + SpaceBeforeBracketComma = false, + SpaceAfterBracketComma = true, + + SpaceBeforeForSemicolon = false, + SpaceAfterForSemicolon = true, + SpaceAfterTypecast = false, + + AlignEmbeddedIfStatements = true, + AlignEmbeddedUsingStatements = true, + PropertyFormatting = PropertyFormatting.AllowOneLine, + SpaceBeforeMethodDeclarationParameterComma = false, + SpaceAfterMethodDeclarationParameterComma = true, + SpaceBeforeFieldDeclarationComma = false, + SpaceAfterFieldDeclarationComma = true, + SpaceBeforeLocalVariableDeclarationComma = false, + SpaceAfterLocalVariableDeclarationComma = true, + + SpaceBeforeIndexerDeclarationBracket = true, + SpaceWithinIndexerDeclarationBracket = false, + SpaceBeforeIndexerDeclarationParameterComma = false, + SpaceInNamedArgumentAfterDoubleColon = true, + + SpaceAfterIndexerDeclarationParameterComma = true, + + BlankLinesBeforeUsings = 0, + BlankLinesAfterUsings = 1, + + BlankLinesBeforeFirstDeclaration = 0, + BlankLinesBetweenTypes = 1, + BlankLinesBetweenFields = 0, + BlankLinesBetweenEventFields = 0, + BlankLinesBetweenMembers = 1, + + KeepCommentsAtFirstColumn = true, + }; + } + + /// + /// Creates allman indent style CSharpFormatting options used in Visual Studio. + /// + public static CSharpFormattingOptions CreateAllman() + { + var baseOptions = CreateSharpDevelop(); + baseOptions.AnonymousMethodBraceStyle = BraceStyle.EndOfLine; + baseOptions.PropertyBraceStyle = BraceStyle.EndOfLine; + baseOptions.PropertyGetBraceStyle = BraceStyle.EndOfLine; + baseOptions.PropertySetBraceStyle = BraceStyle.EndOfLine; + + baseOptions.EventBraceStyle = BraceStyle.EndOfLine; + baseOptions.EventAddBraceStyle = BraceStyle.EndOfLine; + baseOptions.EventRemoveBraceStyle = BraceStyle.EndOfLine; + baseOptions.StatementBraceStyle = BraceStyle.EndOfLine; + baseOptions.ArrayInitializerBraceStyle = BraceStyle.EndOfLine; + return baseOptions; + } + } +} + diff --git a/src/Libraries/NRefactory/ICSharpCode.NRefactory.CSharp/Formatter/GeneratedCodeSettings.cs b/src/Libraries/NRefactory/ICSharpCode.NRefactory.CSharp/Formatter/GeneratedCodeSettings.cs new file mode 100644 index 0000000000..827a3dc949 --- /dev/null +++ b/src/Libraries/NRefactory/ICSharpCode.NRefactory.CSharp/Formatter/GeneratedCodeSettings.cs @@ -0,0 +1,216 @@ +// +// GeneratedCodeSettings.cs +// +// Author: +// Mike Krüger +// +// Copyright (c) 2012 Xamarin Inc. (http://xamarin.com) +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +using System; +using System.Collections.Generic; + +namespace ICSharpCode.NRefactory.CSharp +{ + public enum GeneratedCodeMember + { + Unknown, + + StaticFields, + InstanceFields, + StaticProperties, + InstanceProperties, + Indexer, + Constructors, + StaticMethods, + InstanceMethods, + StaticEvents, + InstanceEvents, + Operators, + NestedTypes + } + + public class GeneratedCodeSettings + { + List codeMemberOrder; + + public List CodeMemberOrder { + get { + return codeMemberOrder; + } + set { + codeMemberOrder = value; + } + } + + public bool GenerateCategoryComments { + get; + set; + } + + public bool SubOrderAlphabetical { + get; + set; + } + + public void Apply (AstNode rootNode) + { + if (rootNode == null) + throw new ArgumentNullException ("rootNode"); + rootNode.AcceptVisitor (new GenerateCodeVisitior (this)); + } + + public virtual string GetCategoryLabel(GeneratedCodeMember memberCategory) + { + switch (memberCategory) { + case GeneratedCodeMember.StaticFields: + return "Static Fields"; + case GeneratedCodeMember.InstanceFields: + return "Fields"; + case GeneratedCodeMember.StaticProperties: + return "Static Properties"; + case GeneratedCodeMember.InstanceProperties: + return "Properties"; + case GeneratedCodeMember.Indexer: + return "Indexer"; + case GeneratedCodeMember.Constructors: + return "Constructors"; + case GeneratedCodeMember.StaticMethods: + return "Static Methods"; + case GeneratedCodeMember.InstanceMethods: + return "Methods"; + case GeneratedCodeMember.StaticEvents: + return "Static Events"; + case GeneratedCodeMember.InstanceEvents: + return "Events"; + case GeneratedCodeMember.Operators: + return "Operators"; + case GeneratedCodeMember.NestedTypes: + return "Nested Types"; + } + return null; + } + + class GenerateCodeVisitior : DepthFirstAstVisitor + { + GeneratedCodeSettings settings; + + public GenerateCodeVisitior(GeneratedCodeSettings settings) + { + if (settings == null) + throw new ArgumentNullException("settings"); + this.settings = settings; + } + + GeneratedCodeMember GetCodeMemberCategory(EntityDeclaration x) + { + bool isStatic = x.HasModifier(Modifiers.Static) || x.HasModifier(Modifiers.Const); + if (x is FieldDeclaration) + return isStatic ? GeneratedCodeMember.StaticFields : GeneratedCodeMember.InstanceFields; + if (x is IndexerDeclaration) + return GeneratedCodeMember.Indexer; + if (x is PropertyDeclaration) + return isStatic ? GeneratedCodeMember.StaticProperties : GeneratedCodeMember.InstanceProperties; + if (x is ConstructorDeclaration || x is DestructorDeclaration) + return GeneratedCodeMember.Constructors; + if (x is MethodDeclaration) + return isStatic ? GeneratedCodeMember.StaticMethods : GeneratedCodeMember.InstanceMethods; + if (x is OperatorDeclaration) + return GeneratedCodeMember.Operators; + if (x is EventDeclaration || x is CustomEventDeclaration) + return isStatic ? GeneratedCodeMember.StaticEvents : GeneratedCodeMember.InstanceEvents; + + if (x is TypeDeclaration) + return GeneratedCodeMember.NestedTypes; + + return GeneratedCodeMember.Unknown; + } + + public override void VisitTypeDeclaration (TypeDeclaration typeDeclaration) + { + if (typeDeclaration.ClassType == ClassType.Enum) + return; + var entities = new List (typeDeclaration.Members); + entities.Sort ((x, y) => { + int i1 = settings.CodeMemberOrder.IndexOf (GetCodeMemberCategory (x)); + int i2 = settings.CodeMemberOrder.IndexOf (GetCodeMemberCategory (y)); + if (i1 != i2) + return i1.CompareTo (i2); + if (settings.SubOrderAlphabetical) + return (x.Name ?? "").CompareTo ((y.Name ?? "")); + return entities.IndexOf (x).CompareTo (entities.IndexOf (y)); + }); + typeDeclaration.Members.Clear (); + typeDeclaration.Members.AddRange (entities); + + if (settings.GenerateCategoryComments) { + var curCat = GeneratedCodeMember.Unknown; + foreach (var mem in entities) { + if (mem.NextSibling is EntityDeclaration) + mem.Parent.InsertChildAfter (mem, new UnixNewLine (), Roles.NewLine); + + var cat = GetCodeMemberCategory (mem); + if (cat == curCat) + continue; + curCat = cat; + var label = settings.GetCategoryLabel (curCat); + if (string.IsNullOrEmpty (label)) + continue; + + var cmt = new Comment ("", CommentType.SingleLine); + var cmt2 = new Comment (" " + label, CommentType.SingleLine); + var cmt3 = new Comment ("", CommentType.SingleLine); + mem.Parent.InsertChildsBefore (mem, Roles.Comment, cmt, cmt2, cmt3); + if (cmt.PrevSibling is EntityDeclaration) + mem.Parent.InsertChildBefore (cmt, new UnixNewLine (), Roles.NewLine); + + mem.Parent.InsertChildAfter (cmt3, new UnixNewLine (), Roles.NewLine); + } + } + } + } + + static Lazy defaultSettings = new Lazy( + () => new GeneratedCodeSettings() { + CodeMemberOrder = new List() { + GeneratedCodeMember.StaticFields, + GeneratedCodeMember.InstanceFields, + GeneratedCodeMember.StaticProperties, + GeneratedCodeMember.InstanceProperties, + GeneratedCodeMember.Indexer, + GeneratedCodeMember.Constructors, + GeneratedCodeMember.StaticMethods, + GeneratedCodeMember.InstanceMethods, + GeneratedCodeMember.StaticEvents, + GeneratedCodeMember.InstanceEvents, + GeneratedCodeMember.Operators, + GeneratedCodeMember.NestedTypes + }, + GenerateCategoryComments = true, + SubOrderAlphabetical = true + }); + + public static GeneratedCodeSettings Default { + get { + return defaultSettings.Value; + } + } + } +} \ No newline at end of file diff --git a/src/Libraries/NRefactory/ICSharpCode.NRefactory.CSharp/ICSharpCode.NRefactory.CSharp.csproj b/src/Libraries/NRefactory/ICSharpCode.NRefactory.CSharp/ICSharpCode.NRefactory.CSharp.csproj index 711487e1fa..290699e9ed 100644 --- a/src/Libraries/NRefactory/ICSharpCode.NRefactory.CSharp/ICSharpCode.NRefactory.CSharp.csproj +++ b/src/Libraries/NRefactory/ICSharpCode.NRefactory.CSharp/ICSharpCode.NRefactory.CSharp.csproj @@ -41,7 +41,8 @@ TRACE;FULL_AST - none + PdbOnly + false full @@ -240,6 +241,7 @@ + @@ -358,6 +360,16 @@ + + + + + + + + + + @@ -370,6 +382,7 @@ + diff --git a/src/Libraries/NRefactory/ICSharpCode.NRefactory.CSharp/OutputVisitor/CSharpAmbience.cs b/src/Libraries/NRefactory/ICSharpCode.NRefactory.CSharp/OutputVisitor/CSharpAmbience.cs index feaf0711ba..c370e58e4c 100644 --- a/src/Libraries/NRefactory/ICSharpCode.NRefactory.CSharp/OutputVisitor/CSharpAmbience.cs +++ b/src/Libraries/NRefactory/ICSharpCode.NRefactory.CSharp/OutputVisitor/CSharpAmbience.cs @@ -1,4 +1,4 @@ -// Copyright (c) AlphaSierraPapa for the SharpDevelop Team +// Copyright (c) AlphaSierraPapa for the SharpDevelop Team // // Permission is hereby granted, free of charge, to any person obtaining a copy of this // software and associated documentation files (the "Software"), to deal in the Software @@ -38,7 +38,7 @@ namespace ICSharpCode.NRefactory.CSharp throw new ArgumentNullException("entity"); StringWriter writer = new StringWriter(); - ConvertEntity(entity, new TextWriterOutputFormatter(writer), new CSharpFormattingOptions()); + ConvertEntity(entity, new TextWriterOutputFormatter(writer), FormattingOptionsFactory.CreateMono ()); return writer.ToString(); } diff --git a/src/Libraries/NRefactory/ICSharpCode.NRefactory.CSharp/OutputVisitor/CSharpOutputVisitor.cs b/src/Libraries/NRefactory/ICSharpCode.NRefactory.CSharp/OutputVisitor/CSharpOutputVisitor.cs index 41eabdb672..4ee6ad30e3 100644 --- a/src/Libraries/NRefactory/ICSharpCode.NRefactory.CSharp/OutputVisitor/CSharpOutputVisitor.cs +++ b/src/Libraries/NRefactory/ICSharpCode.NRefactory.CSharp/OutputVisitor/CSharpOutputVisitor.cs @@ -111,7 +111,7 @@ namespace ICSharpCode.NRefactory.CSharp void WriteSpecials(AstNode start, AstNode end) { for (AstNode pos = start; pos != end; pos = pos.NextSibling) { - if (pos.Role == Roles.Comment || pos.Role == Roles.PreProcessorDirective) { + if (pos.Role == Roles.Comment || pos.Role == Roles.NewLine || pos.Role == Roles.PreProcessorDirective) { pos.AcceptVisitor(this); } } @@ -519,6 +519,7 @@ namespace ICSharpCode.NRefactory.CSharp void WriteEmbeddedStatement(Statement embeddedStatement) { if (embeddedStatement.IsNull) { + NewLine(); return; } BlockStatement block = embeddedStatement as BlockStatement; @@ -659,7 +660,7 @@ namespace ICSharpCode.NRefactory.CSharp void PrintInitializerElements(AstNodeCollection elements) { BraceStyle style; - if (policy.PlaceArrayInitializersOnNewLine == ArrayInitializerPlacement.AlwaysNewLine) { + if (policy.ArrayInitializerWrapping == Wrapping.WrapAlways) { style = BraceStyle.NextLine; } else { style = BraceStyle.EndOfLine; @@ -1584,7 +1585,8 @@ namespace ICSharpCode.NRefactory.CSharp node.AcceptVisitor(this); } CloseBrace(style); - NewLine(); + if (!(blockStatement.Parent is Expression)) + NewLine(); EndNode(blockStatement); } @@ -1694,9 +1696,10 @@ namespace ICSharpCode.NRefactory.CSharp forStatement.Condition.AcceptVisitor(this); Space(policy.SpaceBeforeForSemicolon); WriteToken(Roles.Semicolon); - Space(policy.SpaceAfterForSemicolon); - - WriteCommaSeparatedList(forStatement.Iterators); + if (forStatement.Iterators.Any()) { + Space(policy.SpaceAfterForSemicolon); + WriteCommaSeparatedList(forStatement.Iterators); + } Space(policy.SpacesWithinForParentheses); RPar(); @@ -2373,7 +2376,24 @@ namespace ICSharpCode.NRefactory.CSharp formatter.EndNode(comment); lastWritten = LastWritten.Whitespace; } - + + public void VisitNewLine(NewLineNode newLineNode) + { + formatter.StartNode(newLineNode); + formatter.NewLine(); + formatter.EndNode(newLineNode); + } + + public void VisitWhitespace(WhitespaceNode whitespaceNode) + { + // unused + } + + public void VisitText(TextNode textNode) + { + // unused + } + public void VisitPreProcessorDirective(PreProcessorDirective preProcessorDirective) { formatter.StartNode(preProcessorDirective); diff --git a/src/Libraries/NRefactory/ICSharpCode.NRefactory.CSharp/OutputVisitor/CodeDomConvertVisitor.cs b/src/Libraries/NRefactory/ICSharpCode.NRefactory.CSharp/OutputVisitor/CodeDomConvertVisitor.cs index c54b50271f..6b55c1490e 100644 --- a/src/Libraries/NRefactory/ICSharpCode.NRefactory.CSharp/OutputVisitor/CodeDomConvertVisitor.cs +++ b/src/Libraries/NRefactory/ICSharpCode.NRefactory.CSharp/OutputVisitor/CodeDomConvertVisitor.cs @@ -1,4 +1,4 @@ -// Copyright (c) AlphaSierraPapa for the SharpDevelop Team +// Copyright (c) AlphaSierraPapa for the SharpDevelop Team // // Permission is hereby granted, free of charge, to any person obtaining a copy of this // software and associated documentation files (the "Software"), to deal in the Software @@ -171,7 +171,7 @@ namespace ICSharpCode.NRefactory.CSharp string MakeSnippet(AstNode node) { StringWriter w = new StringWriter(); - CSharpOutputVisitor v = new CSharpOutputVisitor(w, new CSharpFormattingOptions()); + CSharpOutputVisitor v = new CSharpOutputVisitor(w, FormattingOptionsFactory.CreateMono ()); node.AcceptVisitor(v); return w.ToString(); } @@ -1244,7 +1244,22 @@ namespace ICSharpCode.NRefactory.CSharp { return new CodeComment (comment.Content, comment.CommentType == CommentType.Documentation); } - + + CodeObject IAstVisitor.VisitNewLine(NewLineNode newLineNode) + { + throw new NotSupportedException(); + } + + CodeObject IAstVisitor.VisitWhitespace(WhitespaceNode whitespaceNode) + { + throw new NotSupportedException(); + } + + CodeObject IAstVisitor.VisitText(TextNode textNode) + { + throw new NotSupportedException(); + } + CodeObject IAstVisitor.VisitPreProcessorDirective (PreProcessorDirective preProcessorDirective) { return new CodeComment ("#" + preProcessorDirective.Type.ToString ().ToLower ()); diff --git a/src/Libraries/NRefactory/ICSharpCode.NRefactory.CSharp/Parser/mcs/anonymous.cs b/src/Libraries/NRefactory/ICSharpCode.NRefactory.CSharp/Parser/mcs/anonymous.cs index e75353139d..7ef97558f8 100644 --- a/src/Libraries/NRefactory/ICSharpCode.NRefactory.CSharp/Parser/mcs/anonymous.cs +++ b/src/Libraries/NRefactory/ICSharpCode.NRefactory.CSharp/Parser/mcs/anonymous.cs @@ -13,6 +13,7 @@ using System; using System.Collections.Generic; using Mono.CompilerServices.SymbolWriter; +using System.Diagnostics; #if STATIC using IKVM.Reflection; @@ -25,11 +26,20 @@ using System.Reflection.Emit; namespace Mono.CSharp { - public abstract class CompilerGeneratedClass : Class + public abstract class CompilerGeneratedContainer : ClassOrStruct { - protected CompilerGeneratedClass (TypeContainer parent, MemberName name, Modifiers mod) - : base (parent, name, mod | Modifiers.COMPILER_GENERATED, null) + protected CompilerGeneratedContainer (TypeContainer parent, MemberName name, Modifiers mod) + : this (parent, name, mod, MemberKind.Class) + { + } + + protected CompilerGeneratedContainer (TypeContainer parent, MemberName name, Modifiers mod, MemberKind kind) + : base (parent, name, null, kind) { + Debug.Assert ((mod & Modifiers.AccessibilityMask) != 0); + + ModFlags = mod | Modifiers.COMPILER_GENERATED | Modifiers.SEALED; + spec = new TypeSpec (Kind, null, this, null, ModFlags); } protected void CheckMembersDefined () @@ -38,6 +48,15 @@ namespace Mono.CSharp { throw new InternalErrorException ("Helper class already defined!"); } + protected override bool DoDefineMembers () + { + if (Kind == MemberKind.Class && !IsStatic && !PartialContainer.HasInstanceConstructor) { + DefineDefaultConstructor (false); + } + + return base.DoDefineMembers (); + } + protected static MemberName MakeMemberName (MemberBase host, string name, int unique_id, TypeParameters tparams, Location loc) { string host_name = host == null ? null : host is InterfaceMemberBase ? ((InterfaceMemberBase)host).GetFullName (host.MemberName) : host.MemberName.Name; @@ -59,9 +78,17 @@ namespace Mono.CSharp { { return "<" + host + ">" + typePrefix + "__" + name + id.ToString ("X"); } + + protected override TypeSpec[] ResolveBaseTypes (out FullNamedExpression base_class) + { + base_type = Compiler.BuiltinTypes.Object; + + base_class = null; + return null; + } } - public class HoistedStoreyClass : CompilerGeneratedClass + public class HoistedStoreyClass : CompilerGeneratedContainer { public sealed class HoistedField : Field { @@ -86,8 +113,8 @@ namespace Mono.CSharp { protected TypeParameterMutator mutator; - public HoistedStoreyClass (TypeDefinition parent, MemberName name, TypeParameters tparams, Modifiers mod) - : base (parent, name, mod | Modifiers.PRIVATE) + public HoistedStoreyClass (TypeDefinition parent, MemberName name, TypeParameters tparams, Modifiers mods, MemberKind kind) + : base (parent, name, mods | Modifiers.PRIVATE, kind) { if (tparams != null) { @@ -173,7 +200,7 @@ namespace Mono.CSharp { protected override void DoEmit (EmitContext ec) { - hoisted_this.EmitHoistingAssignment (ec); + hoisted_this.EmitAssign (ec, new CompilerGeneratedThis (ec.CurrentType, loc), false, false); } protected override void CloneTo (CloneContext clonectx, Statement target) @@ -185,7 +212,7 @@ namespace Mono.CSharp { // Unique storey ID public readonly int ID; - public readonly Block OriginalSourceBlock; + public readonly ExplicitBlock OriginalSourceBlock; // A list of StoreyFieldPair with local field keeping parent storey instance List used_parent_storeys; @@ -193,6 +220,7 @@ namespace Mono.CSharp { // A list of hoisted parameters protected List hoisted_params; + List hoisted_local_params; protected List hoisted_locals; // Hoisted this @@ -201,9 +229,11 @@ namespace Mono.CSharp { // Local variable which holds this storey instance public Expression Instance; - public AnonymousMethodStorey (Block block, TypeDefinition parent, MemberBase host, TypeParameters tparams, string name) + bool initialize_hoisted_this; + + public AnonymousMethodStorey (ExplicitBlock block, TypeDefinition parent, MemberBase host, TypeParameters tparams, string name, MemberKind kind) : base (parent, MakeMemberName (host, name, parent.Module.CounterAnonymousContainers, tparams, block.StartLocation), - tparams, Modifiers.SEALED) + tparams, 0, kind) { OriginalSourceBlock = block; ID = parent.Module.CounterAnonymousContainers++; @@ -212,18 +242,10 @@ namespace Mono.CSharp { public void AddCapturedThisField (EmitContext ec) { TypeExpr type_expr = new TypeExpression (ec.CurrentType, Location); - Field f = AddCompilerGeneratedField ("<>f__this", type_expr); - f.Define (); + Field f = AddCompilerGeneratedField ("$this", type_expr); hoisted_this = new HoistedThis (this, f); - // Inflated type instance has to be updated manually - if (Instance.Type is InflatedTypeSpec) { - var inflator = new TypeParameterInflator (this, Instance.Type, TypeParameterSpec.EmptyTypes, TypeSpec.EmptyTypes); - Instance.Type.MemberCache.AddMember (f.Spec.InflateMember (inflator)); - - inflator = new TypeParameterInflator (this, f.Parent.CurrentType, TypeParameterSpec.EmptyTypes, TypeSpec.EmptyTypes); - f.Parent.CurrentType.MemberCache.AddMember (f.Spec.InflateMember (inflator)); - } + initialize_hoisted_this = true; } public Field AddCapturedVariable (string name, TypeSpec type) @@ -283,38 +305,93 @@ namespace Mono.CSharp { used_parent_storeys.Add (new StoreyFieldPair (storey, f)); } - public void CaptureLocalVariable (ResolveContext ec, LocalVariable local_info) + public void CaptureLocalVariable (ResolveContext ec, LocalVariable localVariable) { - ec.CurrentBlock.Explicit.HasCapturedVariable = true; - if (ec.CurrentBlock.Explicit != local_info.Block.Explicit) - AddReferenceFromChildrenBlock (ec.CurrentBlock.Explicit); + if (this is StateMachine) { + if (ec.CurrentBlock.ParametersBlock != localVariable.Block.ParametersBlock) + ec.CurrentBlock.Explicit.HasCapturedVariable = true; + } else { + ec.CurrentBlock.Explicit.HasCapturedVariable = true; + } - if (local_info.HoistedVariant != null) - return; + var hoisted = localVariable.HoistedVariant; + if (hoisted != null && hoisted.Storey != this && hoisted.Storey.Kind == MemberKind.Struct) { + // TODO: It's too late the field is defined in HoistedLocalVariable ctor + hoisted.Storey.hoisted_locals.Remove (hoisted); + hoisted = null; + } + + if (hoisted == null) { + hoisted = new HoistedLocalVariable (this, localVariable, GetVariableMangledName (localVariable)); + localVariable.HoistedVariant = hoisted; - HoistedVariable var = new HoistedLocalVariable (this, local_info, GetVariableMangledName (local_info)); - local_info.HoistedVariant = var; + if (hoisted_locals == null) + hoisted_locals = new List (); - if (hoisted_locals == null) - hoisted_locals = new List (); + hoisted_locals.Add (hoisted); + } - hoisted_locals.Add (var); + if (ec.CurrentBlock.Explicit != localVariable.Block.Explicit) + hoisted.Storey.AddReferenceFromChildrenBlock (ec.CurrentBlock.Explicit); } - public void CaptureParameter (ResolveContext ec, ParameterReference param_ref) + public void CaptureParameter (ResolveContext ec, ParametersBlock.ParameterInfo parameterInfo, ParameterReference parameterReference) { - ec.CurrentBlock.Explicit.HasCapturedVariable = true; - AddReferenceFromChildrenBlock (ec.CurrentBlock.Explicit); + if (!(this is StateMachine)) { + ec.CurrentBlock.Explicit.HasCapturedVariable = true; + } - if (param_ref.GetHoistedVariable (ec) != null) - return; + var hoisted = parameterInfo.Parameter.HoistedVariant; + + if (parameterInfo.Block.StateMachine is AsyncTaskStorey) { + // + // Another storey in same block exists but state machine does not + // have parameter captured. We need to add it there as well to + // proxy parameter value correctly. + // + if (hoisted == null && parameterInfo.Block.StateMachine != this) { + var storey = parameterInfo.Block.StateMachine; + + hoisted = new HoistedParameter (storey, parameterReference); + parameterInfo.Parameter.HoistedVariant = hoisted; + + if (storey.hoisted_params == null) + storey.hoisted_params = new List (); - if (hoisted_params == null) - hoisted_params = new List (2); + storey.hoisted_params.Add (hoisted); + } + + // + // Lift captured parameter from value type storey to reference type one. Otherwise + // any side effects would be done on a copy + // + if (hoisted != null && hoisted.Storey != this && hoisted.Storey.Kind == MemberKind.Struct) { + if (hoisted_local_params == null) + hoisted_local_params = new List (); + + hoisted_local_params.Add (hoisted); + hoisted = null; + } + } + + if (hoisted == null) { + hoisted = new HoistedParameter (this, parameterReference); + parameterInfo.Parameter.HoistedVariant = hoisted; - var expr = new HoistedParameter (this, param_ref); - param_ref.Parameter.HoistedVariant = expr; - hoisted_params.Add (expr); + if (hoisted_params == null) + hoisted_params = new List (); + + hoisted_params.Add (hoisted); + } + + // + // Register link between current block and parameter storey. It will + // be used when setting up storey definition to deploy storey reference + // when parameters are used from multiple blocks + // + if (ec.CurrentBlock.Explicit != parameterInfo.Block) { + hoisted.Storey.AddReferenceFromChildrenBlock (ec.CurrentBlock.Explicit); + } } TypeExpr CreateStoreyTypeExpression (EmitContext ec) @@ -429,7 +506,11 @@ namespace Mono.CSharp { Instance = fexpr; } else { var local = TemporaryVariableReference.Create (source.Type, block, Location); - local.EmitAssign (ec, source); + if (source.Type.IsStruct) { + local.LocalInfo.CreateBuilder (ec); + } else { + local.EmitAssign (ec, source); + } Instance = local; } @@ -458,6 +539,7 @@ namespace Mono.CSharp { FieldExpr f_set_expr = new FieldExpr (fs, Location); f_set_expr.InstanceExpression = instace_expr; + // TODO: CompilerAssign expression SimpleAssign a = new SimpleAssign (f_set_expr, sf.Storey.GetStoreyInstanceExpression (ec)); if (a.Resolve (rc) != null) a.EmitStatement (ec); @@ -465,10 +547,10 @@ namespace Mono.CSharp { } // - // Define hoisted `this' in top-level storey only + // Initialize hoisted `this' only once, everywhere else will be + // referenced indirectly // - if (OriginalSourceBlock.Explicit.HasCapturedThis && !(Parent is AnonymousMethodStorey)) { - AddCapturedThisField (ec); + if (initialize_hoisted_this) { rc.CurrentBlock.AddScopeStatement (new ThisInitializer (hoisted_this)); } @@ -485,9 +567,20 @@ namespace Mono.CSharp { ec.CurrentAnonymousMethod = ae; } - protected virtual void EmitHoistedParameters (EmitContext ec, IList hoisted) + protected virtual void EmitHoistedParameters (EmitContext ec, List hoisted) { foreach (HoistedParameter hp in hoisted) { + // + // Parameters could be proxied via local fields for value type storey + // + if (hoisted_local_params != null) { + var local_param = hoisted_local_params.Find (l => l.Parameter.Parameter == hp.Parameter.Parameter); + var source = new FieldExpr (local_param.Field, Location); + source.InstanceExpression = new CompilerGeneratedThis (CurrentType, Location); + hp.EmitAssign (ec, source, false, false); + continue; + } + hp.EmitHoistingAssignment (ec); } } @@ -560,7 +653,12 @@ namespace Mono.CSharp { } public HoistedThis HoistedThis { - get { return hoisted_this; } + get { + return hoisted_this; + } + set { + hoisted_this = value; + } } public IList ReferencesFromChildrenBlock { @@ -628,6 +726,12 @@ namespace Mono.CSharp { this.field = field; } + public AnonymousMethodStorey Storey { + get { + return storey; + } + } + public void AddressOf (EmitContext ec, AddressOp mode) { GetFieldExpression (ec).AddressOf (ec, mode); @@ -709,7 +813,7 @@ namespace Mono.CSharp { public class HoistedParameter : HoistedVariable { - sealed class HoistedFieldAssign : Assign + sealed class HoistedFieldAssign : CompilerAssign { public HoistedFieldAssign (Expression target, Expression source) : base (target, source, source.Location) @@ -740,23 +844,32 @@ namespace Mono.CSharp { this.parameter = hp.parameter; } + #region Properties + public Field Field { get { return field; } } + public ParameterReference Parameter { + get { + return parameter; + } + } + + #endregion + public void EmitHoistingAssignment (EmitContext ec) { // // Remove hoisted redirection to emit assignment from original parameter // - HoistedVariable temp = parameter.Parameter.HoistedVariant; + var temp = parameter.Parameter.HoistedVariant; parameter.Parameter.HoistedVariant = null; - Assign a = new HoistedFieldAssign (GetFieldExpression (ec), parameter); - if (a.Resolve (new ResolveContext (ec.MemberContext)) != null) - a.EmitStatement (ec); + var a = new HoistedFieldAssign (GetFieldExpression (ec), parameter); + a.EmitStatement (ec); parameter.Parameter.HoistedVariant = temp; } @@ -782,13 +895,6 @@ namespace Mono.CSharp { return field; } } - - public void EmitHoistingAssignment (EmitContext ec) - { - SimpleAssign a = new SimpleAssign (GetFieldExpression (ec), new CompilerGeneratedThis (ec.CurrentType, field.Location)); - if (a.Resolve (new ResolveContext (ec.MemberContext)) != null) - a.EmitStatement (ec); - } } // @@ -1003,12 +1109,8 @@ namespace Mono.CSharp { } using (ec.Set (ResolveContext.Options.ProbingMode | ResolveContext.Options.InferReturnType)) { - var body = CompatibleMethodBody (ec, tic, InternalType.Arglist, delegate_type); + var body = CompatibleMethodBody (ec, tic, null, delegate_type); if (body != null) { - if (Block.IsAsync) { - AsyncInitializer.Create (ec, body.Block, body.Parameters, ec.CurrentMemberDefinition.Parent.PartialContainer, null, loc); - } - am = body.Compatible (ec, body); } else { am = null; @@ -1080,6 +1182,10 @@ namespace Mono.CSharp { } else { int errors = ec.Report.Errors; + if (Block.IsAsync) { + ec.Report.Error (1989, loc, "Async lambda expressions cannot be converted to expression trees"); + } + using (ec.Set (ResolveContext.Options.ExpressionTreeConversion)) { am = body.Compatible (ec); } @@ -1091,18 +1197,6 @@ namespace Mono.CSharp { am = CreateExpressionTree (ec, delegate_type); } } else { - if (Block.IsAsync) { - var rt = body.ReturnType; - if (rt.Kind != MemberKind.Void && - rt != ec.Module.PredefinedTypes.Task.TypeSpec && - !rt.IsGenericTask) { - ec.Report.Error (4010, loc, "Cannot convert async {0} to delegate type `{1}'", - GetSignatureForError (), type.GetSignatureForError ()); - } - - AsyncInitializer.Create (ec, body.Block, body.Parameters, ec.CurrentMemberDefinition.Parent.PartialContainer, rt, loc); - } - am = body.Compatible (ec); } } catch (CompletionResult) { @@ -1143,7 +1237,7 @@ namespace Mono.CSharp { for (int i = 0; i < delegate_parameters.Count; i++) { Parameter.Modifier i_mod = delegate_parameters.FixedParameters [i].ModFlags; - if (i_mod == Parameter.Modifier.OUT) { + if ((i_mod & Parameter.Modifier.OUT) != 0) { if (!ec.IsInProbingMode) { ec.Report.Error (1688, loc, "Cannot convert anonymous method block without a parameter list to delegate type `{0}' because it has one or more `out' parameters", @@ -1230,7 +1324,19 @@ namespace Mono.CSharp { ParametersBlock b = ec.IsInProbingMode ? (ParametersBlock) Block.PerformClone () : Block; - return CompatibleMethodFactory (return_type, delegate_type, p, b); + if (b.IsAsync) { + var rt = return_type; + if (rt != null && rt.Kind != MemberKind.Void && rt != ec.Module.PredefinedTypes.Task.TypeSpec && !rt.IsGenericTask) { + ec.Report.Error (4010, loc, "Cannot convert async {0} to delegate type `{1}'", + GetSignatureForError (), delegate_type.GetSignatureForError ()); + + return null; + } + + b = b.ConvertToAsyncTask (ec, ec.CurrentMemberDefinition.Parent.PartialContainer, p, return_type, loc); + } + + return CompatibleMethodFactory (return_type ?? InternalType.Arglist, delegate_type, p, b); } protected virtual AnonymousMethodBody CompatibleMethodFactory (TypeSpec return_type, TypeSpec delegate_type, ParametersCompiled p, ParametersBlock b) @@ -1330,6 +1436,15 @@ namespace Mono.CSharp { public abstract bool IsIterator { get; } public abstract AnonymousMethodStorey Storey { get; } + // + // The block that makes up the body for the anonymous method + // + public ParametersBlock Block { + get { + return block; + } + } + public AnonymousExpression Compatible (ResolveContext ec) { return Compatible (ec, this); @@ -1403,16 +1518,6 @@ namespace Mono.CSharp { b = b.Parent == null ? null : b.Parent.Explicit; } while (b != null); } - - // - // The block that makes up the body for the anonymous method - // - public ParametersBlock Block { - get { - return block; - } - } - } public class AnonymousMethodBody : AnonymousExpression @@ -1500,19 +1605,49 @@ namespace Mono.CSharp { // Modifiers modifiers; - if (Block.HasCapturedVariable || Block.HasCapturedThis) { - storey = FindBestMethodStorey (); + TypeDefinition parent = null; + + var src_block = Block.Original.Explicit; + if (src_block.HasCapturedVariable || src_block.HasCapturedThis) { + parent = storey = FindBestMethodStorey (); + + if (storey == null) { + var sm = src_block.ParametersBlock.TopBlock.StateMachine; + + // + // Remove hoisted this demand when simple instance method is enough + // + if (src_block.HasCapturedThis) { + src_block.ParametersBlock.TopBlock.RemoveThisReferenceFromChildrenBlock (src_block); + + // + // Special case where parent class is used to emit instance method + // because currect storey is of value type (async host) and we don't + // want to create another childer storey to host this reference only + // + if (sm != null && sm.Kind == MemberKind.Struct) + parent = sm.Parent.PartialContainer; + } + + // + // For iterators we can host everything in one class + // + if (sm is IteratorStorey) + parent = storey = sm; + } + modifiers = storey != null ? Modifiers.INTERNAL : Modifiers.PRIVATE; } else { if (ec.CurrentAnonymousMethod != null) - storey = ec.CurrentAnonymousMethod.Storey; + parent = storey = ec.CurrentAnonymousMethod.Storey; modifiers = Modifiers.STATIC | Modifiers.PRIVATE; } - var parent = storey != null ? storey : ec.CurrentTypeDefinition.Parent.PartialContainer; + if (parent == null) + parent = ec.CurrentTypeDefinition.Parent.PartialContainer; - string name = CompilerGeneratedClass.MakeName (parent != storey ? block_name : null, + string name = CompilerGeneratedContainer.MakeName (parent != storey ? block_name : null, "m", null, ec.Module.CounterAnonymousMethods++); MemberName member_name; @@ -1570,7 +1705,7 @@ namespace Mono.CSharp { am_cache = new Field (parent, new TypeExpression (cache_type, loc), Modifiers.STATIC | Modifiers.PRIVATE | Modifiers.COMPILER_GENERATED, - new MemberName (CompilerGeneratedClass.MakeName (null, "f", "am$cache", id), loc), null); + new MemberName (CompilerGeneratedContainer.MakeName (null, "f", "am$cache", id), loc), null); am_cache.Define (); parent.AddField (am_cache); } else { @@ -1610,10 +1745,22 @@ namespace Mono.CSharp { ec.EmitNull (); } else if (storey != null) { Expression e = storey.GetStoreyInstanceExpression (ec).Resolve (new ResolveContext (ec.MemberContext)); - if (e != null) + if (e != null) { e.Emit (ec); + } } else { ec.EmitThis (); + + // + // Special case for value type storey where this is not lifted but + // droped off to parent class + // + for (var b = Block.Parent; b != null; b = b.Parent) { + if (b.ParametersBlock.StateMachine != null) { + ec.Emit (OpCodes.Ldfld, b.ParametersBlock.StateMachine.HoistedThis.Field.Spec); + break; + } + } } var delegate_method = method.Spec; @@ -1624,9 +1771,7 @@ namespace Mono.CSharp { // Mutate anonymous method instance type if we are in nested // hoisted generic anonymous method storey // - if (ec.CurrentAnonymousMethod != null && - ec.CurrentAnonymousMethod.Storey != null && - ec.CurrentAnonymousMethod.Storey.Mutator != null) { + if (ec.IsAnonymousStoreyMutateRequired) { t = storey.Mutator.Mutate (t); } @@ -1679,7 +1824,7 @@ namespace Mono.CSharp { // // Anonymous type container // - public class AnonymousTypeClass : CompilerGeneratedClass + public class AnonymousTypeClass : CompilerGeneratedContainer { public const string ClassNamePrefix = "<>__AnonType"; public const string SignatureForError = "anonymous type"; @@ -1687,7 +1832,7 @@ namespace Mono.CSharp { readonly IList parameters; private AnonymousTypeClass (ModuleContainer parent, MemberName name, IList parameters, Location loc) - : base (parent, name, (parent.Evaluator != null ? Modifiers.PUBLIC : 0) | Modifiers.SEALED) + : base (parent, name, parent.Evaluator != null ? Modifiers.PUBLIC : Modifiers.INTERNAL) { this.parameters = parameters; } @@ -1740,7 +1885,7 @@ namespace Mono.CSharp { c.Block = new ToplevelBlock (parent.Module.Compiler, c.ParameterInfo, loc); // - // Create fields and contructor body with field initialization + // Create fields and constructor body with field initialization // bool error = false; for (int i = 0; i < parameters.Count; ++i) { diff --git a/src/Libraries/NRefactory/ICSharpCode.NRefactory.CSharp/Parser/mcs/argument.cs b/src/Libraries/NRefactory/ICSharpCode.NRefactory.CSharp/Parser/mcs/argument.cs index a6fa8bd843..9da98b8a80 100644 --- a/src/Libraries/NRefactory/ICSharpCode.NRefactory.CSharp/Parser/mcs/argument.cs +++ b/src/Libraries/NRefactory/ICSharpCode.NRefactory.CSharp/Parser/mcs/argument.cs @@ -120,10 +120,14 @@ namespace Mono.CSharp ml.AddressOf (ec, mode); } - public Argument EmitToField (EmitContext ec) + public Argument EmitToField (EmitContext ec, bool cloneResult) { var res = Expr.EmitToField (ec); - return res == Expr ? this : new Argument (res, ArgType); + if (cloneResult && res != Expr) + return new Argument (res, ArgType); + + Expr = res; + return this; } public string GetSignatureForError () @@ -258,7 +262,7 @@ namespace Mono.CSharp { foreach (var a in ordered) { if (prepareAwait) - a.EmitToField (ec); + a.EmitToField (ec, false); else a.EmitToVariable (ec); } @@ -440,7 +444,7 @@ namespace Mono.CSharp LocalTemporary lt; foreach (Argument a in args) { if (prepareAwait) { - dups.Add (a.EmitToField (ec)); + dups.Add (a.EmitToField (ec, true)); continue; } diff --git a/src/Libraries/NRefactory/ICSharpCode.NRefactory.CSharp/Parser/mcs/assembly.cs b/src/Libraries/NRefactory/ICSharpCode.NRefactory.CSharp/Parser/mcs/assembly.cs index a2af418af5..1cdbf45187 100644 --- a/src/Libraries/NRefactory/ICSharpCode.NRefactory.CSharp/Parser/mcs/assembly.cs +++ b/src/Libraries/NRefactory/ICSharpCode.NRefactory.CSharp/Parser/mcs/assembly.cs @@ -1010,7 +1010,7 @@ namespace Mono.CSharp // // A placeholder class for assembly attributes when emitting module // - class AssemblyAttributesPlaceholder : CompilerGeneratedClass + class AssemblyAttributesPlaceholder : CompilerGeneratedContainer { static readonly string TypeNamePrefix = "<$AssemblyAttributes${0}>"; public static readonly string AssemblyFieldName = "attributes"; @@ -1018,7 +1018,7 @@ namespace Mono.CSharp Field assembly; public AssemblyAttributesPlaceholder (ModuleContainer parent, string outputName) - : base (parent, new MemberName (GetGeneratedName (outputName)), Modifiers.STATIC) + : base (parent, new MemberName (GetGeneratedName (outputName)), Modifiers.STATIC | Modifiers.INTERNAL) { assembly = new Field (this, new TypeExpression (parent.Compiler.BuiltinTypes.Object, Location), Modifiers.PUBLIC | Modifiers.STATIC, new MemberName (AssemblyFieldName), null); diff --git a/src/Libraries/NRefactory/ICSharpCode.NRefactory.CSharp/Parser/mcs/assign.cs b/src/Libraries/NRefactory/ICSharpCode.NRefactory.CSharp/Parser/mcs/assign.cs index c5feb00859..673d586d10 100644 --- a/src/Libraries/NRefactory/ICSharpCode.NRefactory.CSharp/Parser/mcs/assign.cs +++ b/src/Libraries/NRefactory/ICSharpCode.NRefactory.CSharp/Parser/mcs/assign.cs @@ -343,7 +343,7 @@ namespace Mono.CSharp { type = target_type; if (!(target is IAssignMethod)) { - Error_ValueAssignment (ec, source); + target.Error_ValueAssignment (ec, source); return null; } @@ -488,6 +488,10 @@ namespace Mono.CSharp { public CompilerAssign (Expression target, Expression source, Location loc) : base (target, source, loc) { + if (target.Type != null) { + type = target.Type; + eclass = ExprClass.Value; + } } protected override Expression DoResolve (ResolveContext ec) @@ -568,10 +572,10 @@ namespace Mono.CSharp { // // Emit sequence symbol info even if we are in compiler generated - // block to allow debugging filed initializers when constructor is + // block to allow debugging field initializers when constructor is // compiler generated // - if (ec.HasSet (BuilderContext.Options.OmitDebugInfo)) { + if (ec.HasSet (BuilderContext.Options.OmitDebugInfo) && ec.HasMethodSymbolBuilder) { using (ec.With (BuilderContext.Options.OmitDebugInfo, false)) { ec.Mark (loc); } @@ -822,7 +826,7 @@ namespace Mono.CSharp { return new SimpleAssign (target, new DynamicConversion (target_type, CSharpBinderFlags.ConvertExplicit, arg, loc), loc).Resolve (ec); } - right.Error_ValueCannotBeConverted (ec, loc, target_type, false); + right.Error_ValueCannotBeConverted (ec, target_type, false); return null; } diff --git a/src/Libraries/NRefactory/ICSharpCode.NRefactory.CSharp/Parser/mcs/async.cs b/src/Libraries/NRefactory/ICSharpCode.NRefactory.CSharp/Parser/mcs/async.cs index 0859d718c9..4c0cce6127 100644 --- a/src/Libraries/NRefactory/ICSharpCode.NRefactory.CSharp/Parser/mcs/async.cs +++ b/src/Libraries/NRefactory/ICSharpCode.NRefactory.CSharp/Parser/mcs/async.cs @@ -46,6 +46,12 @@ namespace Mono.CSharp } } + public AwaitStatement Statement { + get { + return stmt; + } + } + protected override void CloneTo (CloneContext clonectx, Expression target) { var t = (Await) target; @@ -70,11 +76,6 @@ namespace Mono.CSharp "The `await' operator cannot be used in the body of a lock statement"); } - if (rc.HasSet (ResolveContext.Options.ExpressionTreeConversion)) { - rc.Report.Error (1989, loc, "An expression tree cannot contain an await operator"); - return null; - } - if (rc.IsUnsafe) { rc.Report.Error (4004, loc, "The `await' operator cannot be used in an unsafe context"); @@ -124,7 +125,7 @@ namespace Mono.CSharp } } - class AwaitStatement : YieldStatement + public class AwaitStatement : YieldStatement { sealed class AwaitableMemberAccess : MemberAccess { @@ -140,7 +141,13 @@ namespace Mono.CSharp protected override void Error_OperatorCannotBeApplied (ResolveContext rc, TypeSpec type) { - rc.Report.Error (4001, loc, "Cannot await `{0}' expression", type.GetSignatureForError ()); + var invocation = LeftExpression as Invocation; + if (invocation != null && invocation.MethodGroup != null && (invocation.MethodGroup.BestCandidate.Modifiers & Modifiers.ASYNC) != 0) { + rc.Report.Error (4008, loc, "Cannot await void method `{0}'. Consider changing method return type to `Task'", + invocation.GetSignatureForError ()); + } else { + rc.Report.Error (4001, loc, "Cannot await `{0}' expression", type.GetSignatureForError ()); + } } } @@ -161,7 +168,6 @@ namespace Mono.CSharp Field awaiter; PropertySpec is_completed; - MethodSpec on_completed; MethodSpec get_result; TypeSpec type; TypeSpec result_type; @@ -213,6 +219,8 @@ namespace Mono.CSharp public void EmitPrologue (EmitContext ec) { + awaiter = ((AsyncTaskStorey) machine_initializer.Storey).AddAwaiter (expr.Type, loc); + var fe_awaiter = new FieldExpr (awaiter, loc); fe_awaiter.InstanceExpression = new CompilerGeneratedThis (ec.CurrentType, loc); @@ -230,6 +238,10 @@ namespace Mono.CSharp Arguments dargs = new Arguments (1); dargs.Add (new Argument (fe_awaiter)); completed_expr = new DynamicMemberBinder ("IsCompleted", dargs, loc).Resolve (rc); + + dargs = new Arguments (1); + dargs.Add (new Argument (completed_expr)); + completed_expr = new DynamicConversion (ec.Module.Compiler.BuiltinTypes.Bool, 0, dargs, loc).Resolve (rc); } else { var pe = PropertyExpr.CreatePredefined (is_completed, loc); pe.InstanceExpression = fe_awaiter; @@ -252,25 +264,10 @@ namespace Mono.CSharp ec.AssertEmptyStack (); var storey = (AsyncTaskStorey) machine_initializer.Storey; - var cont_field = storey.EmitContinuationInitialization (ec); - - var args = new Arguments (1); - args.Add (new Argument (cont_field)); - if (IsDynamic) { - var rc = new ResolveContext (ec.MemberContext); - var mg_expr = new Invocation (new MemberAccess (fe_awaiter, "OnCompleted"), args).Resolve (rc); - - ExpressionStatement es = (ExpressionStatement) mg_expr; - es.EmitStatement (ec); + storey.EmitAwaitOnCompletedDynamic (ec, fe_awaiter); } else { - var mg_completed = MethodGroupExpr.CreatePredefined (on_completed, fe_awaiter.Type, loc); - mg_completed.InstanceExpression = fe_awaiter; - - // - // awaiter.OnCompleted (continuation); - // - mg_completed.EmitCall (ec, args); + storey.EmitAwaitOnCompleted (ec, fe_awaiter); } // Return ok @@ -285,6 +282,8 @@ namespace Mono.CSharp EmitPrologue (ec); DoEmit (ec); + awaiter.IsAvailableForReuse = true; + if (ResultType.Kind != MemberKind.Void) { var storey = (AsyncTaskStorey) machine_initializer.Storey; @@ -297,12 +296,18 @@ namespace Mono.CSharp void Error_WrongAwaiterPattern (ResolveContext rc, TypeSpec awaiter) { - rc.Report.Error (4011, loc, "The awaiter type `{0}' must have suitable IsCompleted, OnCompleted, and GetResult members", + rc.Report.Error (4011, loc, "The awaiter type `{0}' must have suitable IsCompleted and GetResult members", awaiter.GetSignatureForError ()); } public override bool Resolve (BlockContext bc) { + if (bc.CurrentBlock is Linq.QueryBlock) { + bc.Report.Error (1995, loc, + "The `await' operator may only be used in a query expression within the first collection expression of the initial `from' clause or within the collection expression of a `join' clause"); + return false; + } + if (!base.Resolve (bc)) return false; @@ -315,9 +320,6 @@ namespace Mono.CSharp // if (type.BuiltinType == BuiltinTypeSpec.Type.Dynamic) { result_type = type; - - awaiter = ((AsyncTaskStorey) machine_initializer.Storey).AddAwaiter (type, loc); - expr = new Invocation (new MemberAccess (expr, "GetAwaiter"), args).Resolve (bc); return true; } @@ -343,8 +345,6 @@ namespace Mono.CSharp } var awaiter_type = ama.Type; - awaiter = ((AsyncTaskStorey) machine_initializer.Storey).AddAwaiter (awaiter_type, loc); - expr = ama; // @@ -358,20 +358,6 @@ namespace Mono.CSharp return false; } - // - // Predefined: OnCompleted (Action) - // - if (bc.Module.PredefinedTypes.Action.Define ()) { - on_completed = MemberCache.FindMember (awaiter_type, MemberFilter.Method ("OnCompleted", 0, - ParametersCompiled.CreateFullyResolved (bc.Module.PredefinedTypes.Action.TypeSpec), bc.Module.Compiler.BuiltinTypes.Void), - BindingRestriction.InstanceOnly) as MethodSpec; - - if (on_completed == null) { - Error_WrongAwaiterPattern (bc, awaiter_type); - return false; - } - } - // // Predefined: GetResult () // @@ -386,6 +372,16 @@ namespace Mono.CSharp return false; } + // + // Predefined: INotifyCompletion.OnCompleted (System.Action) + // + var nc = bc.Module.PredefinedTypes.INotifyCompletion; + if (nc.Define () && !awaiter_type.ImplementsInterface (nc.TypeSpec, false)) { + bc.Report.Error (4027, loc, "The awaiter type `{0}' must implement interface `{1}'", + awaiter_type.GetSignatureForError (), nc.GetSignatureForError ()); + return false; + } + result_type = get_result.ReturnType; return true; @@ -415,12 +411,6 @@ namespace Mono.CSharp } } - public Block OriginalBlock { - get { - return block.Parent; - } - } - public TypeInferenceContext ReturnTypeInference { get { return return_inference; @@ -429,38 +419,6 @@ namespace Mono.CSharp #endregion - public static void Create (IMemberContext context, ParametersBlock block, ParametersCompiled parameters, TypeDefinition host, TypeSpec returnType, Location loc) - { - for (int i = 0; i < parameters.Count; i++) { - Parameter p = parameters[i]; - Parameter.Modifier mod = p.ModFlags; - if ((mod & Parameter.Modifier.ISBYREF) != 0) { - host.Compiler.Report.Error (1988, p.Location, - "Async methods cannot have ref or out parameters"); - return; - } - - if (p is ArglistParameter) { - host.Compiler.Report.Error (4006, p.Location, - "__arglist is not allowed in parameter list of async methods"); - return; - } - - if (parameters.Types[i].IsPointer) { - host.Compiler.Report.Error (4005, p.Location, - "Async methods cannot have unsafe parameters"); - return; - } - } - - if (!block.HasAwait) { - host.Compiler.Report.Warning (1998, 1, loc, - "Async block lacks `await' operator and will run synchronously"); - } - - block.WrapIntoAsyncTask (context, host, returnType); - } - protected override BlockContext CreateBlockContext (ResolveContext rc) { var ctx = base.CreateBlockContext (rc); @@ -491,37 +449,7 @@ namespace Mono.CSharp public override void EmitStatement (EmitContext ec) { var storey = (AsyncTaskStorey) Storey; - storey.Instance.Emit (ec); - - var move_next_entry = storey.StateMachineMethod.Spec; - if (storey.MemberName.Arity > 0) { - move_next_entry = MemberCache.GetMember (storey.Instance.Type, move_next_entry); - } - - ec.Emit (OpCodes.Call, move_next_entry); - - // - // Emits return .$builder.Task; - // - if (storey.Task != null) { - var builder_field = storey.Builder.Spec; - var task_get = storey.Task.Get; - - if (storey.MemberName.Arity > 0) { - builder_field = MemberCache.GetMember (storey.Instance.Type, builder_field); - task_get = MemberCache.GetMember (builder_field.MemberType, task_get); - } - - var pe_task = new PropertyExpr (storey.Task, loc) { - InstanceExpression = new FieldExpr (builder_field, loc) { - InstanceExpression = storey.Instance - }, - Getter = task_get - }; - - pe_task.Emit (ec); - } - + storey.EmitInitializer (ec); ec.Emit (OpCodes.Ret); } } @@ -529,30 +457,27 @@ namespace Mono.CSharp class AsyncTaskStorey : StateMachine { int awaiters; - Field builder, continuation; + Field builder; readonly TypeSpec return_type; MethodSpec set_result; MethodSpec set_exception; + MethodSpec builder_factory; + MethodSpec builder_start; PropertySpec task; LocalVariable hoisted_return; int locals_captured; - Dictionary> stack_fields; - TypeSpec action; + Dictionary> stack_fields; + Dictionary> awaiter_fields; - public AsyncTaskStorey (IMemberContext context, AsyncInitializer initializer, TypeSpec type) - : base (initializer.OriginalBlock, initializer.Host, context.CurrentMemberDefinition as MemberBase, context.CurrentTypeParameters, "async") + public AsyncTaskStorey (ParametersBlock block, IMemberContext context, AsyncInitializer initializer, TypeSpec type) + : base (block, initializer.Host, context.CurrentMemberDefinition as MemberBase, context.CurrentTypeParameters, "async", MemberKind.Struct) { return_type = type; + awaiter_fields = new Dictionary> (); } #region Properties - public Field Builder { - get { - return builder; - } - } - public LocalVariable HoistedReturn { get { return hoisted_return; @@ -575,34 +500,53 @@ namespace Mono.CSharp public Field AddAwaiter (TypeSpec type, Location loc) { - return AddCapturedVariable ("$awaiter" + awaiters++.ToString ("X"), type); + if (mutator != null) + type = mutator.Mutate (type); + + List existing_fields = null; + if (awaiter_fields.TryGetValue (type, out existing_fields)) { + foreach (var f in existing_fields) { + if (f.IsAvailableForReuse) { + f.IsAvailableForReuse = false; + return f; + } + } + } + + var field = AddCompilerGeneratedField ("$awaiter" + awaiters++.ToString ("X"), new TypeExpression (type, Location), true); + field.Define (); + + if (existing_fields == null) { + existing_fields = new List (); + awaiter_fields.Add (type, existing_fields); + } + + existing_fields.Add (field); + return field; } - public StackField AddCapturedLocalVariable (TypeSpec type) + public Field AddCapturedLocalVariable (TypeSpec type) { if (mutator != null) type = mutator.Mutate (type); - List existing_fields = null; + List existing_fields = null; if (stack_fields == null) { - stack_fields = new Dictionary> (); + stack_fields = new Dictionary> (); } else if (stack_fields.TryGetValue (type, out existing_fields)) { foreach (var f in existing_fields) { - if (f.CanBeReused) { - f.CanBeReused = false; + if (f.IsAvailableForReuse) { + f.IsAvailableForReuse = false; return f; } } } - const Modifiers mod = Modifiers.COMPILER_GENERATED | Modifiers.PRIVATE; - var field = new StackField (this, new TypeExpression (type, Location), mod, new MemberName ("$" + locals_captured++.ToString ("X"), Location)); - AddField (field); - + var field = AddCompilerGeneratedField ("$stack" + locals_captured++.ToString ("X"), new TypeExpression (type, Location), true); field.Define (); if (existing_fields == null) { - existing_fields = new List (); + existing_fields = new List (); stack_fields.Add (type, existing_fields); } @@ -613,39 +557,52 @@ namespace Mono.CSharp protected override bool DoDefineMembers () { - action = Module.PredefinedTypes.Action.Resolve (); - PredefinedType builder_type; PredefinedMember bf; + PredefinedMember bs; PredefinedMember sr; PredefinedMember se; + PredefinedMember sm; bool has_task_return_type = false; var pred_members = Module.PredefinedMembers; if (return_type.Kind == MemberKind.Void) { builder_type = Module.PredefinedTypes.AsyncVoidMethodBuilder; bf = pred_members.AsyncVoidMethodBuilderCreate; + bs = pred_members.AsyncVoidMethodBuilderStart; sr = pred_members.AsyncVoidMethodBuilderSetResult; se = pred_members.AsyncVoidMethodBuilderSetException; + sm = pred_members.AsyncVoidMethodBuilderSetStateMachine; } else if (return_type == Module.PredefinedTypes.Task.TypeSpec) { builder_type = Module.PredefinedTypes.AsyncTaskMethodBuilder; bf = pred_members.AsyncTaskMethodBuilderCreate; + bs = pred_members.AsyncTaskMethodBuilderStart; sr = pred_members.AsyncTaskMethodBuilderSetResult; se = pred_members.AsyncTaskMethodBuilderSetException; + sm = pred_members.AsyncTaskMethodBuilderSetStateMachine; task = pred_members.AsyncTaskMethodBuilderTask.Get (); } else { builder_type = Module.PredefinedTypes.AsyncTaskMethodBuilderGeneric; bf = pred_members.AsyncTaskMethodBuilderGenericCreate; + bs = pred_members.AsyncTaskMethodBuilderGenericStart; sr = pred_members.AsyncTaskMethodBuilderGenericSetResult; se = pred_members.AsyncTaskMethodBuilderGenericSetException; + sm = pred_members.AsyncTaskMethodBuilderGenericSetStateMachine; task = pred_members.AsyncTaskMethodBuilderGenericTask.Get (); has_task_return_type = true; } set_result = sr.Get (); set_exception = se.Get (); - var builder_factory = bf.Get (); - if (!builder_type.Define () || set_result == null || builder_factory == null || set_exception == null) { + builder_factory = bf.Get (); + builder_start = bs.Get (); + + var istate_machine = Module.PredefinedTypes.IAsyncStateMachine; + var set_statemachine = sm.Get (); + + if (!builder_type.Define () || !istate_machine.Define () || set_result == null || builder_factory == null || + set_exception == null || set_statemachine == null || builder_start == null || + !Module.PredefinedTypes.INotifyCompletion.Define ()) { Report.Error (1993, Location, "Cannot find compiler required types for asynchronous functions support. Are you targeting the wrong framework version?"); return base.DoDefineMembers (); @@ -662,83 +619,206 @@ namespace Mono.CSharp task_return_type = mutator.Mutate (task_return_type); bt = bt.MakeGenericType (Module, task_return_type); - builder_factory = MemberCache.GetMember (bt, builder_factory); - set_result = MemberCache.GetMember (bt, set_result); - set_exception = MemberCache.GetMember (bt, set_exception); + set_result = MemberCache.GetMember (bt, set_result); + set_exception = MemberCache.GetMember (bt, set_exception); + set_statemachine = MemberCache.GetMember (bt, set_statemachine); if (task != null) - task = MemberCache.GetMember (bt, task); + task = MemberCache.GetMember (bt, task); } builder = AddCompilerGeneratedField ("$builder", new TypeExpression (bt, Location)); - var ctor = DefineDefaultConstructor (false); + var set_state_machine = new Method (this, new TypeExpression (Compiler.BuiltinTypes.Void, Location), + Modifiers.COMPILER_GENERATED | Modifiers.DEBUGGER_HIDDEN | Modifiers.PUBLIC, + new MemberName ("SetStateMachine"), + ParametersCompiled.CreateFullyResolved ( + new Parameter (new TypeExpression (istate_machine.TypeSpec, Location), "stateMachine", Parameter.Modifier.NONE, null, Location), + istate_machine.TypeSpec), + null); + + ToplevelBlock block = new ToplevelBlock (Compiler, set_state_machine.ParameterInfo, Location); + block.IsCompilerGenerated = true; + set_state_machine.Block = block; + + Members.Add (set_state_machine); if (!base.DoDefineMembers ()) return false; - Block block = ctor.Block; + // + // Fabricates SetStateMachine method + // + // public void SetStateMachine (IAsyncStateMachine stateMachine) + // { + // $builder.SetStateMachine (stateMachine); + // } + // + var mg = MethodGroupExpr.CreatePredefined (set_statemachine, bt, Location); + mg.InstanceExpression = new FieldExpr (builder, Location); - var mg = MethodGroupExpr.CreatePredefined (builder_factory, bt, Location); - block.AddStatement ( - new StatementExpression (new SimpleAssign ( - new FieldExpr (builder, Location), - new Invocation (mg, new Arguments (0)), - Location))); + var param_reference = block.GetParameterReference (0, Location); + param_reference.Type = istate_machine.TypeSpec; + param_reference.eclass = ExprClass.Variable; + + var args = new Arguments (1); + args.Add (new Argument (param_reference)); + set_state_machine.Block.AddStatement (new StatementExpression (new Invocation (mg, args))); if (has_task_return_type) { - hoisted_return = LocalVariable.CreateCompilerGenerated (bt.TypeArguments[0], block, Location); + hoisted_return = LocalVariable.CreateCompilerGenerated (bt.TypeArguments[0], StateMachineMethod.Block, Location); } return true; } - public Expression EmitContinuationInitialization (EmitContext ec) + public void EmitAwaitOnCompletedDynamic (EmitContext ec, FieldExpr awaiter) { + var critical = Module.PredefinedTypes.ICriticalNotifyCompletion; + if (!critical.Define ()) { + throw new NotImplementedException (); + } + + var temp_critical = new LocalTemporary (critical.TypeSpec); + var label_critical = ec.DefineLabel (); + var label_end = ec.DefineLabel (); + // - // When more than 1 awaiter has been used in the block we - // introduce class scope field to cache continuation delegate + // Special path for dynamic awaiters // - if (awaiters > 1) { - if (continuation == null) { - continuation = AddCompilerGeneratedField ("$continuation", new TypeExpression (action, Location), true); - continuation.Define (); - } + // var awaiter = this.$awaiter as ICriticalNotifyCompletion; + // if (awaiter == null) { + // var completion = (INotifyCompletion) this.$awaiter; + // this.$builder.AwaitOnCompleted (ref completion, ref this); + // } else { + // this.$builder.AwaitUnsafeOnCompleted (ref awaiter, ref this); + // } + // + awaiter.Emit (ec); + ec.Emit (OpCodes.Isinst, critical.TypeSpec); + temp_critical.Store (ec); + temp_critical.Emit (ec); + ec.Emit (OpCodes.Brtrue_S, label_critical); + + var temp = new LocalTemporary (Module.PredefinedTypes.INotifyCompletion.TypeSpec); + awaiter.Emit (ec); + ec.Emit (OpCodes.Castclass, temp.Type); + temp.Store (ec); + EmitOnCompleted (ec, temp, false); + temp.Release (ec); + ec.Emit (OpCodes.Br_S, label_end); - var fexpr = new FieldExpr (continuation, Location); - fexpr.InstanceExpression = new CompilerGeneratedThis (CurrentType, Location); + ec.MarkLabel (label_critical); - // - // if ($continuation == null) - // $continuation = new Action (MoveNext); - // - fexpr.Emit (ec); + EmitOnCompleted (ec, temp_critical, true); - var skip_cont_init = ec.DefineLabel (); - ec.Emit (OpCodes.Brtrue_S, skip_cont_init); + ec.MarkLabel (label_end); - ec.EmitThis (); - EmitActionLoad (ec); - ec.Emit (OpCodes.Stfld, continuation.Spec); - ec.MarkLabel (skip_cont_init); + temp_critical.Release (ec); + } - return fexpr; + public void EmitAwaitOnCompleted (EmitContext ec, FieldExpr awaiter) + { + bool unsafe_version = false; + if (Module.PredefinedTypes.ICriticalNotifyCompletion.Define ()) { + unsafe_version = awaiter.Type.ImplementsInterface (Module.PredefinedTypes.ICriticalNotifyCompletion.TypeSpec, false); } - // - // Otherwise simply use temporary local variable - // - var field = LocalVariable.CreateCompilerGenerated (action, OriginalSourceBlock, Location); - EmitActionLoad (ec); - field.EmitAssign (ec); - return new LocalVariableReference (field, Location); + EmitOnCompleted (ec, awaiter, unsafe_version); } - void EmitActionLoad (EmitContext ec) + void EmitOnCompleted (EmitContext ec, Expression awaiter, bool unsafeVersion) { - ec.EmitThis (); - ec.Emit (OpCodes.Ldftn, StateMachineMethod.Spec); - ec.Emit (OpCodes.Newobj, (MethodSpec) MemberCache.FindMember (action, MemberFilter.Constructor (null), BindingRestriction.DeclaredOnly)); + var pm = Module.PredefinedMembers; + PredefinedMember predefined; + bool has_task_return_type = false; + if (return_type.Kind == MemberKind.Void) { + predefined = unsafeVersion ? pm.AsyncVoidMethodBuilderOnCompletedUnsafe : pm.AsyncVoidMethodBuilderOnCompleted; + } else if (return_type == Module.PredefinedTypes.Task.TypeSpec) { + predefined = unsafeVersion ? pm.AsyncTaskMethodBuilderOnCompletedUnsafe : pm.AsyncTaskMethodBuilderOnCompleted; + } else { + predefined = unsafeVersion ? pm.AsyncTaskMethodBuilderGenericOnCompletedUnsafe : pm.AsyncTaskMethodBuilderGenericOnCompleted; + has_task_return_type = true; + } + + var on_completed = predefined.Resolve (Location); + if (on_completed == null) + return; + + if (has_task_return_type) + on_completed = MemberCache.GetMember (set_result.DeclaringType, on_completed); + + on_completed = on_completed.MakeGenericMethod (this, awaiter.Type, ec.CurrentType); + + var mg = MethodGroupExpr.CreatePredefined (on_completed, on_completed.DeclaringType, Location); + mg.InstanceExpression = new FieldExpr (builder, Location) { + InstanceExpression = new CompilerGeneratedThis (ec.CurrentType, Location) + }; + + var args = new Arguments (2); + args.Add (new Argument (awaiter, Argument.AType.Ref)); + args.Add (new Argument (new CompilerGeneratedThis (CurrentType, Location), Argument.AType.Ref)); + mg.EmitCall (ec, args); + } + + public void EmitInitializer (EmitContext ec) + { + // + // Some predefined types are missing + // + if (builder == null) + return; + + var instance = (TemporaryVariableReference) Instance; + var builder_field = builder.Spec; + if (MemberName.Arity > 0) { + builder_field = MemberCache.GetMember (instance.Type, builder_field); + } + + // + // Inflated factory method when task is of generic type + // + if (builder_factory.DeclaringType.IsGeneric) { + var task_return_type = return_type.TypeArguments; + var bt = builder_factory.DeclaringType.MakeGenericType (Module, task_return_type); + builder_factory = MemberCache.GetMember (bt, builder_factory); + builder_start = MemberCache.GetMember (bt, builder_start); + } + + // + // stateMachine.$builder = AsyncTaskMethodBuilder<{task-type}>.Create(); + // + instance.AddressOf (ec, AddressOp.Store); + ec.Emit (OpCodes.Call, builder_factory); + ec.Emit (OpCodes.Stfld, builder_field); + + // + // stateMachine.$builder.Start<{storey-type}>(ref stateMachine); + // + instance.AddressOf (ec, AddressOp.Store); + ec.Emit (OpCodes.Ldflda, builder_field); + if (Task != null) + ec.Emit (OpCodes.Dup); + instance.AddressOf (ec, AddressOp.Store); + ec.Emit (OpCodes.Call, builder_start.MakeGenericMethod (Module, instance.Type)); + + // + // Emits return stateMachine.$builder.Task; + // + if (Task != null) { + var task_get = Task.Get; + + if (MemberName.Arity > 0) { + task_get = MemberCache.GetMember (builder_field.MemberType, task_get); + } + + var pe_task = new PropertyExpr (Task, Location) { + InstanceExpression = EmptyExpression.Null, // Comes from the dup above + Getter = task_get + }; + + pe_task.Emit (ec); + } } public void EmitSetException (EmitContext ec, LocalVariableReference exceptionVariable) @@ -747,7 +827,7 @@ namespace Mono.CSharp // $builder.SetException (Exception) // var mg = MethodGroupExpr.CreatePredefined (set_exception, set_exception.DeclaringType, Location); - mg.InstanceExpression = new FieldExpr (Builder, Location) { + mg.InstanceExpression = new FieldExpr (builder, Location) { InstanceExpression = new CompilerGeneratedThis (ec.CurrentType, Location) }; @@ -764,7 +844,7 @@ namespace Mono.CSharp // $builder.SetResult (value); // var mg = MethodGroupExpr.CreatePredefined (set_result, set_result.DeclaringType, Location); - mg.InstanceExpression = new FieldExpr (Builder, Location) { + mg.InstanceExpression = new FieldExpr (builder, Location) { InstanceExpression = new CompilerGeneratedThis (ec.CurrentType, Location) }; @@ -778,31 +858,57 @@ namespace Mono.CSharp mg.EmitCall (ec, args); } - } - class StackField : Field - { - public StackField (TypeDefinition parent, FullNamedExpression type, Modifiers mod, MemberName name) - : base (parent, type, mod, name, null) + protected override TypeSpec[] ResolveBaseTypes (out FullNamedExpression base_class) { - } + base_type = Compiler.BuiltinTypes.ValueType; + base_class = null; - public bool CanBeReused { get; set; } + var istate_machine = Module.PredefinedTypes.IAsyncStateMachine; + if (istate_machine.Define ()) { + return new[] { istate_machine.TypeSpec }; + } + + return null; + } } - class StackFieldExpr : FieldExpr + class StackFieldExpr : FieldExpr, IExpressionCleanup { public StackFieldExpr (Field field) : base (field, Location.Null) { } + public override void AddressOf (EmitContext ec, AddressOp mode) + { + base.AddressOf (ec, mode); + + if (mode == AddressOp.Load) { + var field = (Field) spec.MemberDefinition; + field.IsAvailableForReuse = true; + } + } + public override void Emit (EmitContext ec) { base.Emit (ec); - var field = (StackField) spec.MemberDefinition; - field.CanBeReused = true; + var field = (Field) spec.MemberDefinition; + field.IsAvailableForReuse = true; + + // + // Release any captured reference type stack variables + // to imitate real stack behavour and help GC stuff early + // + if (TypeSpec.IsReferenceType (type)) { + ec.AddStatementEpilog (this); + } + } + + void IExpressionCleanup.EmitCleanup (EmitContext ec) + { + EmitAssign (ec, new NullConstant (type, loc), false, false); } } } diff --git a/src/Libraries/NRefactory/ICSharpCode.NRefactory.CSharp/Parser/mcs/attribute.cs b/src/Libraries/NRefactory/ICSharpCode.NRefactory.CSharp/Parser/mcs/attribute.cs index 79843c49e8..47eaad62e0 100644 --- a/src/Libraries/NRefactory/ICSharpCode.NRefactory.CSharp/Parser/mcs/attribute.cs +++ b/src/Libraries/NRefactory/ICSharpCode.NRefactory.CSharp/Parser/mcs/attribute.cs @@ -902,6 +902,11 @@ namespace Mono.CSharp { // Returns true for MethodImplAttribute with MethodImplOptions.InternalCall value // public bool IsInternalCall () + { + return (GetMethodImplOptions () & MethodImplOptions.InternalCall) != 0; + } + + public MethodImplOptions GetMethodImplOptions () { MethodImplOptions options = 0; if (pos_args.Count == 1) { @@ -911,7 +916,7 @@ namespace Mono.CSharp { options = (MethodImplOptions) System.Enum.Parse (typeof (MethodImplOptions), named.GetValue ().ToString ()); } - return (options & MethodImplOptions.InternalCall) != 0; + return options; } // @@ -1631,6 +1636,9 @@ namespace Mono.CSharp { public readonly PredefinedDecimalAttribute DecimalConstant; public readonly PredefinedAttribute StructLayout; public readonly PredefinedAttribute FieldOffset; + public readonly PredefinedAttribute CallerMemberNameAttribute; + public readonly PredefinedAttribute CallerLineNumberAttribute; + public readonly PredefinedAttribute CallerFilePathAttribute; public PredefinedAttributes (ModuleContainer module) { @@ -1682,6 +1690,10 @@ namespace Mono.CSharp { StructLayout = new PredefinedAttribute (module, "System.Runtime.InteropServices", "StructLayoutAttribute"); FieldOffset = new PredefinedAttribute (module, "System.Runtime.InteropServices", "FieldOffsetAttribute"); + CallerMemberNameAttribute = new PredefinedAttribute (module, "System.Runtime.CompilerServices", "CallerMemberNameAttribute"); + CallerLineNumberAttribute = new PredefinedAttribute (module, "System.Runtime.CompilerServices", "CallerLineNumberAttribute"); + CallerFilePathAttribute = new PredefinedAttribute (module, "System.Runtime.CompilerServices", "CallerFilePathAttribute"); + // TODO: Should define only attributes which are used for comparison const System.Reflection.BindingFlags all_fields = System.Reflection.BindingFlags.Public | System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.DeclaredOnly; diff --git a/src/Libraries/NRefactory/ICSharpCode.NRefactory.CSharp/Parser/mcs/cfold.cs b/src/Libraries/NRefactory/ICSharpCode.NRefactory.CSharp/Parser/mcs/cfold.cs index 7580124cee..9e2cfc8b96 100644 --- a/src/Libraries/NRefactory/ICSharpCode.NRefactory.CSharp/Parser/mcs/cfold.cs +++ b/src/Libraries/NRefactory/ICSharpCode.NRefactory.CSharp/Parser/mcs/cfold.cs @@ -149,7 +149,7 @@ namespace Mono.CSharp { case Binary.Operator.ExclusiveOr: result = BinaryFold (ec, oper, ((EnumConstant)left).Child, ((EnumConstant)right).Child, loc); if (result != null) - result = result.TryReduce (ec, lt, loc); + result = result.TryReduce (ec, lt); return result; /// @@ -158,7 +158,7 @@ namespace Mono.CSharp { case Binary.Operator.Subtraction: result = BinaryFold (ec, oper, ((EnumConstant)left).Child, ((EnumConstant)right).Child, loc); if (result != null) - result = result.TryReduce (ec, EnumSpec.GetUnderlyingType (lt), loc); + result = result.TryReduce (ec, EnumSpec.GetUnderlyingType (lt)); return result; /// @@ -340,7 +340,7 @@ namespace Mono.CSharp { if (result == null) return null; - result = result.TryReduce (ec, lt, loc); + result = result.TryReduce (ec, lt); if (result == null) return null; @@ -459,7 +459,7 @@ namespace Mono.CSharp { if (result == null) return null; - result = result.TryReduce (ec, lt, loc); + result = result.TryReduce (ec, lt); if (result == null) return null; diff --git a/src/Libraries/NRefactory/ICSharpCode.NRefactory.CSharp/Parser/mcs/class.cs b/src/Libraries/NRefactory/ICSharpCode.NRefactory.CSharp/Parser/mcs/class.cs index d7de3ce14c..de601e1451 100644 --- a/src/Libraries/NRefactory/ICSharpCode.NRefactory.CSharp/Parser/mcs/class.cs +++ b/src/Libraries/NRefactory/ICSharpCode.NRefactory.CSharp/Parser/mcs/class.cs @@ -85,16 +85,15 @@ namespace Mono.CSharp } } -#if FULL_AST // - // Any unattached attributes during parsing get added here. + // Any unattached attributes during parsing get added here. User + // by FULL_AST mode // public Attributes UnattachedAttributes { get; set; } -#endif - public virtual void AddCompilerGeneratedClass (CompilerGeneratedClass c) + public virtual void AddCompilerGeneratedClass (CompilerGeneratedContainer c) { containers.Add (c); } @@ -747,7 +746,7 @@ namespace Mono.CSharp base.AddTypeContainer (tc); } - public override void AddCompilerGeneratedClass (CompilerGeneratedClass c) + public override void AddCompilerGeneratedClass (CompilerGeneratedContainer c) { members.Add (c); @@ -1326,7 +1325,7 @@ namespace Mono.CSharp } if (proxy_method == null) { - string name = CompilerGeneratedClass.MakeName (method.Name, null, "BaseCallProxy", hoisted_base_call_proxies.Count); + string name = CompilerGeneratedContainer.MakeName (method.Name, null, "BaseCallProxy", hoisted_base_call_proxies.Count); var base_parameters = new Parameter[method.Parameters.Count]; for (int i = 0; i < base_parameters.Length; ++i) { var base_param = method.Parameters.FixedParameters[i]; @@ -1958,28 +1957,28 @@ namespace Mono.CSharp if (OptAttributes != null) OptAttributes.Emit (); - if (!IsTopLevel) { - MemberSpec candidate; - bool overrides = false; - var conflict_symbol = MemberCache.FindBaseMember (this, out candidate, ref overrides); - if (conflict_symbol == null && candidate == null) { - if ((ModFlags & Modifiers.NEW) != 0) - Report.Warning (109, 4, Location, "The member `{0}' does not hide an inherited member. The new keyword is not required", - GetSignatureForError ()); - } else { - if ((ModFlags & Modifiers.NEW) == 0) { - if (candidate == null) - candidate = conflict_symbol; + if (!IsCompilerGenerated) { + if (!IsTopLevel) { + MemberSpec candidate; + bool overrides = false; + var conflict_symbol = MemberCache.FindBaseMember (this, out candidate, ref overrides); + if (conflict_symbol == null && candidate == null) { + if ((ModFlags & Modifiers.NEW) != 0) + Report.Warning (109, 4, Location, "The member `{0}' does not hide an inherited member. The new keyword is not required", + GetSignatureForError ()); + } else { + if ((ModFlags & Modifiers.NEW) == 0) { + if (candidate == null) + candidate = conflict_symbol; - Report.SymbolRelatedToPreviousError (candidate); - Report.Warning (108, 2, Location, "`{0}' hides inherited member `{1}'. Use the new keyword if hiding was intended", - GetSignatureForError (), candidate.GetSignatureForError ()); + Report.SymbolRelatedToPreviousError (candidate); + Report.Warning (108, 2, Location, "`{0}' hides inherited member `{1}'. Use the new keyword if hiding was intended", + GetSignatureForError (), candidate.GetSignatureForError ()); + } } } - } - // Run constraints check on all possible generic types - if ((ModFlags & Modifiers.COMPILER_GENERATED) == 0) { + // Run constraints check on all possible generic types if (base_type != null && base_type_expr != null) { ConstraintChecker.Check (this, base_type, base_type_expr.Location); } @@ -2355,6 +2354,8 @@ namespace Mono.CSharp public abstract class ClassOrStruct : TypeDefinition { + public const TypeAttributes StaticClassAttribute = TypeAttributes.Abstract | TypeAttributes.Sealed; + SecurityType declarative_security; public ClassOrStruct (TypeContainer parent, MemberName name, Attributes attrs, MemberKind kind) @@ -2364,7 +2365,19 @@ namespace Mono.CSharp protected override TypeAttributes TypeAttr { get { - return has_static_constructor ? base.TypeAttr : base.TypeAttr | TypeAttributes.BeforeFieldInit; + TypeAttributes ta = base.TypeAttr; + if (!has_static_constructor) + ta |= TypeAttributes.BeforeFieldInit; + + if (Kind == MemberKind.Class) { + ta |= TypeAttributes.AutoLayout | TypeAttributes.Class; + if (IsStatic) + ta |= StaticClassAttribute; + } else { + ta |= TypeAttributes.SequentialLayout; + } + + return ta; } } @@ -2479,8 +2492,8 @@ namespace Mono.CSharp } - // TODO: should be sealed - public class Class : ClassOrStruct { + public sealed class Class : ClassOrStruct + { const Modifiers AllowedModifiers = Modifiers.NEW | Modifiers.PUBLIC | @@ -2492,8 +2505,6 @@ namespace Mono.CSharp Modifiers.STATIC | Modifiers.UNSAFE; - public const TypeAttributes StaticClassAttribute = TypeAttributes.Abstract | TypeAttributes.Sealed; - public Class (TypeContainer parent, MemberName name, Modifiers mod, Attributes attrs) : base (parent, name, attrs, MemberKind.Class) { @@ -2687,23 +2698,10 @@ namespace Mono.CSharp caching_flags |= Flags.Excluded; return conditions; } - - // - // FIXME: How do we deal with the user specifying a different - // layout? - // - protected override TypeAttributes TypeAttr { - get { - TypeAttributes ta = base.TypeAttr | TypeAttributes.AutoLayout | TypeAttributes.Class; - if (IsStatic) - ta |= StaticClassAttribute; - return ta; - } - } } - public sealed class Struct : ClassOrStruct { - + public sealed class Struct : ClassOrStruct + { bool is_unmanaged, has_unmanaged_check_done; bool InTransit; @@ -2875,17 +2873,6 @@ namespace Mono.CSharp return ifaces; } - protected override TypeAttributes TypeAttr { - get { - const - TypeAttributes DefaultTypeAttributes = - TypeAttributes.SequentialLayout | - TypeAttributes.Sealed ; - - return base.TypeAttr | DefaultTypeAttributes; - } - } - public override void RegisterFieldForInitialization (MemberCore field, FieldInitializer expression) { if ((field.ModFlags & Modifiers.STATIC) == 0) { diff --git a/src/Libraries/NRefactory/ICSharpCode.NRefactory.CSharp/Parser/mcs/codegen.cs b/src/Libraries/NRefactory/ICSharpCode.NRefactory.CSharp/Parser/mcs/codegen.cs index 342025b2b3..026d410698 100644 --- a/src/Libraries/NRefactory/ICSharpCode.NRefactory.CSharp/Parser/mcs/codegen.cs +++ b/src/Libraries/NRefactory/ICSharpCode.NRefactory.CSharp/Parser/mcs/codegen.cs @@ -83,6 +83,8 @@ namespace Mono.CSharp Label? return_label; + List epilogue_expressions; + public EmitContext (IMemberContext rc, ILGenerator ig, TypeSpec return_type, SourceMethodBuilder methodSymbols) { this.member_context = rc; @@ -137,6 +139,12 @@ namespace Mono.CSharp } } + public bool HasMethodSymbolBuilder { + get { + return methodSymbols != null; + } + } + public bool HasReturnLabel { get { return return_label.HasValue; @@ -190,8 +198,25 @@ namespace Mono.CSharp } } + public List StatementEpilogue { + get { + return epilogue_expressions; + } + } + #endregion + public void AddStatementEpilog (IExpressionCleanup cleanupExpression) + { + if (epilogue_expressions == null) { + epilogue_expressions = new List (); + } else if (epilogue_expressions.Contains (cleanupExpression)) { + return; + } + + epilogue_expressions.Add (cleanupExpression); + } + public void AssertEmptyStack () { #if STATIC @@ -810,6 +835,17 @@ namespace Mono.CSharp ig.Emit (OpCodes.Ldarg_0); } + public void EmitEpilogue () + { + if (epilogue_expressions == null) + return; + + foreach (var e in epilogue_expressions) + e.EmitCleanup (this); + + epilogue_expressions = null; + } + /// /// Returns a temporary storage for a variable of type t as /// a local variable in the current body. @@ -1060,9 +1096,11 @@ namespace Mono.CSharp return false; // - // It's non-virtual and will never be null + // It's non-virtual and will never be null and it can be determined + // whether it's known value or reference type by verifier // - if (!method.IsVirtual && (instance is This || instance is New || instance is ArrayCreation || instance is DelegateCreation)) + if (!method.IsVirtual && (instance is This || instance is New || instance is ArrayCreation || instance is DelegateCreation) && + !instance.Type.IsGenericParameter) return false; return true; diff --git a/src/Libraries/NRefactory/ICSharpCode.NRefactory.CSharp/Parser/mcs/const.cs b/src/Libraries/NRefactory/ICSharpCode.NRefactory.CSharp/Parser/mcs/const.cs index 7f91ce5eac..5eb93d129a 100644 --- a/src/Libraries/NRefactory/ICSharpCode.NRefactory.CSharp/Parser/mcs/const.cs +++ b/src/Libraries/NRefactory/ICSharpCode.NRefactory.CSharp/Parser/mcs/const.cs @@ -205,7 +205,7 @@ namespace Mono.CSharp { else if (!(expr is Constant)) Error_ExpressionMustBeConstant (rc, expr.Location, GetSignatureForError ()); else - expr.Error_ValueCannotBeConverted (rc, expr.Location, field.MemberType, false); + expr.Error_ValueCannotBeConverted (rc, field.MemberType, false); } expr = c; diff --git a/src/Libraries/NRefactory/ICSharpCode.NRefactory.CSharp/Parser/mcs/constant.cs b/src/Libraries/NRefactory/ICSharpCode.NRefactory.CSharp/Parser/mcs/constant.cs index 3869f1e805..4297c521d1 100644 --- a/src/Libraries/NRefactory/ICSharpCode.NRefactory.CSharp/Parser/mcs/constant.cs +++ b/src/Libraries/NRefactory/ICSharpCode.NRefactory.CSharp/Parser/mcs/constant.cs @@ -58,7 +58,7 @@ namespace Mono.CSharp { } #endif - public override void Error_ValueCannotBeConverted (ResolveContext ec, Location loc, TypeSpec target, bool expl) + public override void Error_ValueCannotBeConverted (ResolveContext ec, TypeSpec target, bool expl) { if (!expl && IsLiteral && BuiltinTypeSpec.IsPrimitiveTypeOrDecimal (target) && @@ -66,7 +66,7 @@ namespace Mono.CSharp { ec.Report.Error (31, loc, "Constant value `{0}' cannot be converted to a `{1}'", GetValueAsLiteral (), TypeManager.CSharpName (target)); } else { - base.Error_ValueCannotBeConverted (ec, loc, target, expl); + base.Error_ValueCannotBeConverted (ec, target, expl); } } @@ -74,7 +74,7 @@ namespace Mono.CSharp { { Constant c = ConvertImplicitly (type); if (c == null) - Error_ValueCannotBeConverted (ec, loc, type, false); + Error_ValueCannotBeConverted (ec, type, false); return c; } @@ -160,8 +160,11 @@ namespace Mono.CSharp { return new NullConstant (t, loc); } - throw new InternalErrorException ("Constant value `{0}' has unexpected underlying type `{1}'", - v, TypeManager.CSharpName (t)); +#if STATIC + throw new InternalErrorException ("Constant value `{0}' has unexpected underlying type `{1}'", v, t.GetSignatureForError ()); +#else + return null; +#endif } public override Expression CreateExpressionTree (ResolveContext ec) @@ -251,32 +254,38 @@ namespace Mono.CSharp { /// /// Attempts to do a compile-time folding of a constant cast. /// - public Constant TryReduce (ResolveContext ec, TypeSpec target_type, Location loc) + public Constant TryReduce (ResolveContext ec, TypeSpec target_type) { try { - return TryReduce (ec, target_type); - } - catch (OverflowException) { + return TryReduceConstant (ec, target_type); + } catch (OverflowException) { if (ec.ConstantCheckState && Type.BuiltinType != BuiltinTypeSpec.Type.Decimal) { ec.Report.Error (221, loc, "Constant value `{0}' cannot be converted to a `{1}' (use `unchecked' syntax to override)", GetValueAsLiteral (), target_type.GetSignatureForError ()); } else { - Error_ValueCannotBeConverted (ec, loc, target_type, false); + Error_ValueCannotBeConverted (ec, target_type, false); } return New.Constantify (target_type, loc); } } - Constant TryReduce (ResolveContext ec, TypeSpec target_type) + Constant TryReduceConstant (ResolveContext ec, TypeSpec target_type) { - if (Type == target_type) + if (Type == target_type) { + // + // Reducing literal value produces a new constant. Syntactically 10 is not same as (int)10 + // + if (IsLiteral) + return CreateConstantFromValue (target_type, GetValue (), loc); + return this; + } Constant c; if (target_type.IsEnum) { - c = TryReduce (ec, EnumSpec.GetUnderlyingType (target_type)); + c = TryReduceConstant (ec, EnumSpec.GetUnderlyingType (target_type)); if (c == null) return null; @@ -378,11 +387,11 @@ namespace Mono.CSharp { eclass = ExprClass.Value; } - public override void Error_ValueCannotBeConverted (ResolveContext ec, Location loc, TypeSpec target, bool expl) + public override void Error_ValueCannotBeConverted (ResolveContext ec, TypeSpec target, bool expl) { try { ConvertExplicitly (true, target); - base.Error_ValueCannotBeConverted (ec, loc, target, expl); + base.Error_ValueCannotBeConverted (ec, target, expl); } catch { diff --git a/src/Libraries/NRefactory/ICSharpCode.NRefactory.CSharp/Parser/mcs/context.cs b/src/Libraries/NRefactory/ICSharpCode.NRefactory.CSharp/Parser/mcs/context.cs index 4a2318c2b5..5f309854bd 100644 --- a/src/Libraries/NRefactory/ICSharpCode.NRefactory.CSharp/Parser/mcs/context.cs +++ b/src/Libraries/NRefactory/ICSharpCode.NRefactory.CSharp/Parser/mcs/context.cs @@ -481,7 +481,7 @@ namespace Mono.CSharp // or it's a parameter // if (CurrentAnonymousMethod is AsyncInitializer) - return CurrentBlock.Explicit.HasAwait; + return local.IsParameter || CurrentBlock.Explicit.HasAwait; return local.Block.ParametersBlock != CurrentBlock.ParametersBlock.Original; } diff --git a/src/Libraries/NRefactory/ICSharpCode.NRefactory.CSharp/Parser/mcs/convert.cs b/src/Libraries/NRefactory/ICSharpCode.NRefactory.CSharp/Parser/mcs/convert.cs index 0daf116e9e..a9a304dfc9 100644 --- a/src/Libraries/NRefactory/ICSharpCode.NRefactory.CSharp/Parser/mcs/convert.cs +++ b/src/Libraries/NRefactory/ICSharpCode.NRefactory.CSharp/Parser/mcs/convert.cs @@ -495,6 +495,11 @@ namespace Mono.CSharp { return ImplicitNumericConversion (expr, expr.Type, target_type); } + public static bool ImplicitNumericConversionExists (TypeSpec expr_type, TypeSpec target_type) + { + return ImplicitNumericConversion (null, expr_type, target_type) != null; + } + static Expression ImplicitNumericConversion (Expression expr, TypeSpec expr_type, TypeSpec target_type) { switch (expr_type.BuiltinType) { @@ -1190,7 +1195,7 @@ namespace Mono.CSharp { if (s_x != source_type) { var c = source as Constant; if (c != null) { - source = c.TryReduce (ec, s_x, loc); + source = c.TryReduce (ec, s_x); } else { source = implicitOnly ? ImplicitConversionStandard (ec, source_type_expr, s_x, loc) : @@ -1418,7 +1423,7 @@ namespace Mono.CSharp { if (e != null) return e; - source.Error_ValueCannotBeConverted (ec, loc, target_type, false); + source.Error_ValueCannotBeConverted (ec, target_type, false); return null; } @@ -2098,7 +2103,7 @@ namespace Mono.CSharp { if (ec.IsUnsafe && expr.Type.IsPointer && target_type.IsPointer && ((PointerContainer)expr.Type).Element.Kind == MemberKind.Void) return EmptyCast.Create (expr, target_type); - expr.Error_ValueCannotBeConverted (ec, l, target_type, true); + expr.Error_ValueCannotBeConverted (ec, target_type, true); return null; } @@ -2161,7 +2166,7 @@ namespace Mono.CSharp { if (e != null) return e; - expr.Error_ValueCannotBeConverted (ec, loc, target_type, true); + expr.Error_ValueCannotBeConverted (ec, target_type, true); return null; } } diff --git a/src/Libraries/NRefactory/ICSharpCode.NRefactory.CSharp/Parser/mcs/cs-parser.cs b/src/Libraries/NRefactory/ICSharpCode.NRefactory.CSharp/Parser/mcs/cs-parser.cs index 1ad75da526..77893426d1 100644 --- a/src/Libraries/NRefactory/ICSharpCode.NRefactory.CSharp/Parser/mcs/cs-parser.cs +++ b/src/Libraries/NRefactory/ICSharpCode.NRefactory.CSharp/Parser/mcs/cs-parser.cs @@ -367,6 +367,7 @@ namespace Mono.CSharp //t "fixed_parameters : fixed_parameters COMMA fixed_parameter", //t "fixed_parameter : opt_attributes opt_parameter_modifier parameter_type IDENTIFIER", //t "fixed_parameter : opt_attributes opt_parameter_modifier parameter_type IDENTIFIER OPEN_BRACKET CLOSE_BRACKET", +//t "fixed_parameter : attribute_sections error", //t "fixed_parameter : opt_attributes opt_parameter_modifier parameter_type error", //t "$$26 :", //t "fixed_parameter : opt_attributes opt_parameter_modifier parameter_type IDENTIFIER ASSIGN $$26 constant_expression", @@ -651,7 +652,7 @@ namespace Mono.CSharp //t "argument_list : argument_or_named_argument", //t "argument_list : argument_list COMMA argument", //t "argument_list : argument_list COMMA named_argument", -//t "argument_list : argument_list COMMA", +//t "argument_list : argument_list COMMA error", //t "argument_list : COMMA error", //t "argument : expression", //t "argument : non_simple_argument", @@ -783,6 +784,7 @@ namespace Mono.CSharp //t "null_coalescing_expression : conditional_or_expression OP_COALESCING null_coalescing_expression", //t "conditional_expression : null_coalescing_expression", //t "conditional_expression : null_coalescing_expression INTERR expression COLON expression_or_error", +//t "conditional_expression : null_coalescing_expression INTERR expression error", //t "assignment_expression : prefixed_unary_expression ASSIGN expression", //t "assignment_expression : prefixed_unary_expression OP_MULT_ASSIGN expression", //t "assignment_expression : prefixed_unary_expression OP_DIV_ASSIGN expression", @@ -994,6 +996,7 @@ namespace Mono.CSharp //t "switch_labels : switch_label", //t "switch_labels : switch_labels switch_label", //t "switch_label : CASE constant_expression COLON", +//t "switch_label : CASE constant_expression error", //t "switch_label : DEFAULT_COLON", //t "iteration_statement : while_statement", //t "iteration_statement : do_statement", @@ -1011,7 +1014,7 @@ namespace Mono.CSharp //t "for_statement_cont : opt_for_initializer CLOSE_PARENS", //t "$$89 :", //t "for_statement_condition : opt_for_condition SEMICOLON $$89 for_statement_end", -//t "for_statement_condition : opt_for_condition CLOSE_PARENS", +//t "for_statement_condition : boolean_expression CLOSE_PARENS", //t "for_statement_end : opt_for_iterator CLOSE_PARENS embedded_statement", //t "for_statement_end : error", //t "opt_for_initializer :", @@ -1040,11 +1043,14 @@ namespace Mono.CSharp //t "jump_statement : yield_statement", //t "break_statement : BREAK SEMICOLON", //t "continue_statement : CONTINUE SEMICOLON", +//t "continue_statement : CONTINUE error", //t "goto_statement : GOTO identifier_inside_body SEMICOLON", //t "goto_statement : GOTO CASE constant_expression SEMICOLON", //t "goto_statement : GOTO DEFAULT SEMICOLON", //t "return_statement : RETURN opt_expression SEMICOLON", +//t "return_statement : RETURN error", //t "throw_statement : THROW opt_expression SEMICOLON", +//t "throw_statement : THROW error", //t "yield_statement : identifier_inside_body RETURN opt_expression SEMICOLON", //t "yield_statement : identifier_inside_body BREAK SEMICOLON", //t "opt_expression :", @@ -1091,16 +1097,16 @@ namespace Mono.CSharp //t "from_clause : FROM identifier_inside_body IN $$98 expression_or_error", //t "$$99 :", //t "from_clause : FROM type identifier_inside_body IN $$99 expression_or_error", -//t "query_body : opt_query_body_clauses select_or_group_clause opt_query_continuation", -//t "query_body : opt_query_body_clauses COMPLETE_COMPLETION", +//t "query_body : query_body_clauses select_or_group_clause opt_query_continuation", +//t "query_body : select_or_group_clause opt_query_continuation", +//t "query_body : query_body_clauses COMPLETE_COMPLETION", +//t "query_body : query_body_clauses error", //t "query_body : error", //t "$$100 :", //t "select_or_group_clause : SELECT $$100 expression_or_error", //t "$$101 :", //t "$$102 :", //t "select_or_group_clause : GROUP $$101 expression_or_error $$102 BY expression_or_error", -//t "opt_query_body_clauses :", -//t "opt_query_body_clauses : query_body_clauses", //t "query_body_clauses : query_body_clause", //t "query_body_clauses : query_body_clauses query_body_clause", //t "query_body_clause : from_clause", @@ -1422,7 +1428,7 @@ case 6: case_6(); break; case 7: -#line 408 "cs-parser.jay" +#line 410 "cs-parser.jay" { module.AddAttributes ((Attributes) yyVals[0+yyTop], current_namespace); } @@ -1434,7 +1440,7 @@ case 13: case_13(); break; case 14: -#line 453 "cs-parser.jay" +#line 455 "cs-parser.jay" { Error_SyntaxError (yyToken); } @@ -1473,7 +1479,7 @@ case 39: case_39(); break; case 40: -#line 619 "cs-parser.jay" +#line 621 "cs-parser.jay" { current_namespace.DeclarationFound = true; } @@ -1849,27 +1855,27 @@ case 170: case_170(); break; case 171: -#line 1541 "cs-parser.jay" + case_171(); + break; +case 172: +#line 1547 "cs-parser.jay" { ++lexer.parsing_block; } break; -case 172: - case_172(); - break; case 173: -#line 1582 "cs-parser.jay" + case_173(); + break; +case 174: +#line 1588 "cs-parser.jay" { yyVal = Parameter.Modifier.NONE; } break; -case 175: -#line 1590 "cs-parser.jay" +case 176: +#line 1596 "cs-parser.jay" { yyVal = yyVals[0+yyTop]; } break; -case 176: - case_176(); - break; case 177: case_177(); break; @@ -1895,14 +1901,14 @@ case 184: case_184(); break; case 185: -#line 1683 "cs-parser.jay" + case_185(); + break; +case 186: +#line 1689 "cs-parser.jay" { Error_DuplicateParameterModifier (GetLocation (yyVals[-1+yyTop]), Parameter.Modifier.PARAMS); } break; -case 186: - case_186(); - break; case 187: case_187(); break; @@ -1916,25 +1922,25 @@ case 190: case_190(); break; case 191: -#line 1737 "cs-parser.jay" + case_191(); + break; +case 192: +#line 1743 "cs-parser.jay" { valid_param_mod = ParameterModifierType.Params | ParameterModifierType.DefaultValue; } break; -case 192: - case_192(); - break; case 193: -#line 1766 "cs-parser.jay" + case_193(); + break; +case 194: +#line 1772 "cs-parser.jay" { lexer.PropertyParsing = false; } break; -case 194: - case_194(); - break; -case 199: - case_199(); +case 195: + case_195(); break; case 200: case_200(); @@ -1948,21 +1954,21 @@ case 202: case 203: case_203(); break; -case 205: - case_205(); +case 204: + case_204(); break; case 206: case_206(); break; case 207: -#line 1915 "cs-parser.jay" + case_207(); + break; +case 208: +#line 1921 "cs-parser.jay" { lexer.ConstraintsParsing = true; } break; -case 208: - case_208(); - break; case 209: case_209(); break; @@ -1973,183 +1979,183 @@ case 211: case_211(); break; case 212: -#line 1954 "cs-parser.jay" - { - Error_SyntaxError (yyToken); - } + case_212(); break; -case 215: -#line 1966 "cs-parser.jay" +case 213: +#line 1960 "cs-parser.jay" { - lexer.parsing_modifiers = true; + Error_SyntaxError (yyToken); } break; case 216: -#line 1970 "cs-parser.jay" +#line 1972 "cs-parser.jay" { lexer.parsing_modifiers = true; } break; case 217: -#line 1977 "cs-parser.jay" +#line 1976 "cs-parser.jay" { - report.Error (525, GetLocation (yyVals[0+yyTop]), "Interfaces cannot contain fields or constants"); + lexer.parsing_modifiers = true; } break; case 218: -#line 1981 "cs-parser.jay" +#line 1983 "cs-parser.jay" { report.Error (525, GetLocation (yyVals[0+yyTop]), "Interfaces cannot contain fields or constants"); } break; -case 223: -#line 1989 "cs-parser.jay" +case 219: +#line 1987 "cs-parser.jay" { - report.Error (567, GetLocation (yyVals[0+yyTop]), "Interfaces cannot contain operators"); + report.Error (525, GetLocation (yyVals[0+yyTop]), "Interfaces cannot contain fields or constants"); } break; case 224: -#line 1993 "cs-parser.jay" +#line 1995 "cs-parser.jay" { - report.Error (526, GetLocation (yyVals[0+yyTop]), "Interfaces cannot contain contructors"); + report.Error (567, GetLocation (yyVals[0+yyTop]), "Interfaces cannot contain operators"); } break; case 225: -#line 1997 "cs-parser.jay" +#line 1999 "cs-parser.jay" { - report.Error (524, GetLocation (yyVals[0+yyTop]), "Interfaces cannot declare classes, structs, interfaces, delegates, or enumerations"); + report.Error (526, GetLocation (yyVals[0+yyTop]), "Interfaces cannot contain contructors"); } break; case 226: #line 2003 "cs-parser.jay" { + report.Error (524, GetLocation (yyVals[0+yyTop]), "Interfaces cannot declare classes, structs, interfaces, delegates, or enumerations"); } break; case 227: - case_227(); +#line 2009 "cs-parser.jay" + { + } break; -case 229: -#line 2036 "cs-parser.jay" - { savedLocation = GetLocation (yyVals[0+yyTop]); yyVal = null; } +case 228: + case_228(); break; -case 231: - case_231(); +case 230: +#line 2042 "cs-parser.jay" + { savedLocation = GetLocation (yyVals[0+yyTop]); yyVal = null; } break; case 232: -#line 2052 "cs-parser.jay" + case_232(); + break; +case 233: +#line 2058 "cs-parser.jay" { valid_param_mod = ParameterModifierType.DefaultValue; } break; -case 233: - case_233(); +case 234: + case_234(); break; -case 235: -#line 2098 "cs-parser.jay" +case 236: +#line 2104 "cs-parser.jay" { yyVal = Operator.OpType.LogicalNot; savedOperatorLocation = GetLocation (yyVals[0+yyTop]); } break; -case 236: -#line 2099 "cs-parser.jay" +case 237: +#line 2105 "cs-parser.jay" { yyVal = Operator.OpType.OnesComplement; savedOperatorLocation = GetLocation (yyVals[0+yyTop]); } break; -case 237: -#line 2100 "cs-parser.jay" +case 238: +#line 2106 "cs-parser.jay" { yyVal = Operator.OpType.Increment; savedOperatorLocation = GetLocation (yyVals[0+yyTop]); } break; -case 238: -#line 2101 "cs-parser.jay" +case 239: +#line 2107 "cs-parser.jay" { yyVal = Operator.OpType.Decrement; savedOperatorLocation = GetLocation (yyVals[0+yyTop]); } break; -case 239: -#line 2102 "cs-parser.jay" +case 240: +#line 2108 "cs-parser.jay" { yyVal = Operator.OpType.True; savedOperatorLocation = GetLocation (yyVals[0+yyTop]); } break; -case 240: -#line 2103 "cs-parser.jay" +case 241: +#line 2109 "cs-parser.jay" { yyVal = Operator.OpType.False; savedOperatorLocation = GetLocation (yyVals[0+yyTop]); } break; -case 241: -#line 2105 "cs-parser.jay" +case 242: +#line 2111 "cs-parser.jay" { yyVal = Operator.OpType.Addition; savedOperatorLocation = GetLocation (yyVals[0+yyTop]); } break; -case 242: -#line 2106 "cs-parser.jay" +case 243: +#line 2112 "cs-parser.jay" { yyVal = Operator.OpType.Subtraction; savedOperatorLocation = GetLocation (yyVals[0+yyTop]); } break; -case 243: -#line 2108 "cs-parser.jay" +case 244: +#line 2114 "cs-parser.jay" { yyVal = Operator.OpType.Multiply; savedOperatorLocation = GetLocation (yyVals[0+yyTop]); } break; -case 244: -#line 2109 "cs-parser.jay" +case 245: +#line 2115 "cs-parser.jay" { yyVal = Operator.OpType.Division; savedOperatorLocation = GetLocation (yyVals[0+yyTop]); } break; -case 245: -#line 2110 "cs-parser.jay" +case 246: +#line 2116 "cs-parser.jay" { yyVal = Operator.OpType.Modulus; savedOperatorLocation = GetLocation (yyVals[0+yyTop]); } break; -case 246: -#line 2111 "cs-parser.jay" +case 247: +#line 2117 "cs-parser.jay" { yyVal = Operator.OpType.BitwiseAnd; savedOperatorLocation = GetLocation (yyVals[0+yyTop]); } break; -case 247: -#line 2112 "cs-parser.jay" +case 248: +#line 2118 "cs-parser.jay" { yyVal = Operator.OpType.BitwiseOr; savedOperatorLocation = GetLocation (yyVals[0+yyTop]); } break; -case 248: -#line 2113 "cs-parser.jay" +case 249: +#line 2119 "cs-parser.jay" { yyVal = Operator.OpType.ExclusiveOr; savedOperatorLocation = GetLocation (yyVals[0+yyTop]); } break; -case 249: -#line 2114 "cs-parser.jay" +case 250: +#line 2120 "cs-parser.jay" { yyVal = Operator.OpType.LeftShift; savedOperatorLocation = GetLocation (yyVals[0+yyTop]); } break; -case 250: -#line 2115 "cs-parser.jay" +case 251: +#line 2121 "cs-parser.jay" { yyVal = Operator.OpType.RightShift; savedOperatorLocation = GetLocation (yyVals[0+yyTop]); } break; -case 251: -#line 2116 "cs-parser.jay" +case 252: +#line 2122 "cs-parser.jay" { yyVal = Operator.OpType.Equality; savedOperatorLocation = GetLocation (yyVals[0+yyTop]); } break; -case 252: -#line 2117 "cs-parser.jay" +case 253: +#line 2123 "cs-parser.jay" { yyVal = Operator.OpType.Inequality; savedOperatorLocation = GetLocation (yyVals[0+yyTop]); } break; -case 253: -#line 2118 "cs-parser.jay" +case 254: +#line 2124 "cs-parser.jay" { yyVal = Operator.OpType.GreaterThan; savedOperatorLocation = GetLocation (yyVals[0+yyTop]); } break; -case 254: -#line 2119 "cs-parser.jay" +case 255: +#line 2125 "cs-parser.jay" { yyVal = Operator.OpType.LessThan; savedOperatorLocation = GetLocation (yyVals[0+yyTop]); } break; -case 255: -#line 2120 "cs-parser.jay" +case 256: +#line 2126 "cs-parser.jay" { yyVal = Operator.OpType.GreaterThanOrEqual; savedOperatorLocation = GetLocation (yyVals[0+yyTop]); } break; -case 256: -#line 2121 "cs-parser.jay" +case 257: +#line 2127 "cs-parser.jay" { yyVal = Operator.OpType.LessThanOrEqual; savedOperatorLocation = GetLocation (yyVals[0+yyTop]); } break; -case 257: -#line 2128 "cs-parser.jay" +case 258: +#line 2134 "cs-parser.jay" { valid_param_mod = ParameterModifierType.DefaultValue; } break; -case 258: - case_258(); - break; case 259: -#line 2147 "cs-parser.jay" + case_259(); + break; +case 260: +#line 2153 "cs-parser.jay" { valid_param_mod = ParameterModifierType.DefaultValue; } break; -case 260: - case_260(); - break; case 261: case_261(); break; @@ -2168,28 +2174,28 @@ case 265: case 266: case_266(); break; -case 268: -#line 2253 "cs-parser.jay" +case 267: + case_267(); + break; +case 269: +#line 2259 "cs-parser.jay" { current_block = null; yyVal = null; } break; -case 271: -#line 2265 "cs-parser.jay" +case 272: +#line 2271 "cs-parser.jay" { ++lexer.parsing_block; } break; -case 272: - case_272(); - break; case 273: -#line 2275 "cs-parser.jay" + case_273(); + break; +case 274: +#line 2281 "cs-parser.jay" { ++lexer.parsing_block; } break; -case 274: - case_274(); - break; case 275: case_275(); break; @@ -2217,21 +2223,18 @@ case 282: case 283: case_283(); break; -case 285: -#line 2393 "cs-parser.jay" - { - ++lexer.parsing_block; - } +case 284: + case_284(); break; case 286: - case_286(); - break; -case 289: -#line 2410 "cs-parser.jay" +#line 2397 "cs-parser.jay" { - current_event_field.AddDeclarator ((FieldDeclarator) yyVals[0+yyTop]); + ++lexer.parsing_block; } break; +case 287: + case_287(); + break; case 290: #line 2414 "cs-parser.jay" { @@ -2239,29 +2242,32 @@ case 290: } break; case 291: - case_291(); +#line 2418 "cs-parser.jay" + { + current_event_field.AddDeclarator ((FieldDeclarator) yyVals[0+yyTop]); + } break; case 292: -#line 2427 "cs-parser.jay" + case_292(); + break; +case 293: +#line 2431 "cs-parser.jay" { ++lexer.parsing_block; } break; -case 293: - case_293(); - break; case 294: case_294(); break; case 295: -#line 2452 "cs-parser.jay" + case_295(); + break; +case 296: +#line 2456 "cs-parser.jay" { yyVal = yyVals[0+yyTop]; } break; -case 298: - case_298(); - break; case 299: case_299(); break; @@ -2283,8 +2289,8 @@ case 304: case 305: case_305(); break; -case 307: - case_307(); +case 306: + case_306(); break; case 308: case_308(); @@ -2298,21 +2304,21 @@ case 310: case 311: case_311(); break; -case 313: - case_313(); +case 312: + case_312(); break; case 314: case_314(); break; -case 317: -#line 2627 "cs-parser.jay" +case 315: + case_315(); + break; +case 318: +#line 2624 "cs-parser.jay" { lbag.AppendToMember (current_container, GetLocation (yyVals[0+yyTop])); } break; -case 319: - case_319(); - break; case 320: case_320(); break; @@ -2323,37 +2329,37 @@ case 322: case_322(); break; case 323: -#line 2685 "cs-parser.jay" + case_323(); + break; +case 324: +#line 2682 "cs-parser.jay" { valid_param_mod = ParameterModifierType.Ref | ParameterModifierType.Out | ParameterModifierType.Params | ParameterModifierType.DefaultValue; } break; -case 324: - case_324(); - break; case 325: -#line 2704 "cs-parser.jay" + case_325(); + break; +case 326: +#line 2701 "cs-parser.jay" { lexer.ConstraintsParsing = false; } break; -case 326: - case_326(); - break; -case 328: - case_328(); +case 327: + case_327(); break; -case 330: - case_330(); +case 329: + case_329(); break; -case 332: - case_332(); +case 331: + case_331(); break; case 333: case_333(); break; -case 335: - case_335(); +case 334: + case_334(); break; case 336: case_336(); @@ -2365,19 +2371,19 @@ case 338: case_338(); break; case 339: -#line 2810 "cs-parser.jay" + case_339(); + break; +case 340: +#line 2807 "cs-parser.jay" { lexer.parsing_generic_declaration = true; } break; -case 340: - case_340(); - break; case 341: case_341(); break; -case 343: - case_343(); +case 342: + case_342(); break; case 344: case_344(); @@ -2394,8 +2400,8 @@ case 347: case 348: case_348(); break; -case 350: - case_350(); +case 349: + case_349(); break; case 351: case_351(); @@ -2409,60 +2415,60 @@ case 353: case 354: case_354(); break; -case 356: -#line 2932 "cs-parser.jay" +case 355: + case_355(); + break; +case 357: +#line 2929 "cs-parser.jay" { yyVal = new TypeExpression (compiler.BuiltinTypes.Void, GetLocation (yyVals[0+yyTop])); } break; -case 357: -#line 2939 "cs-parser.jay" +case 358: +#line 2936 "cs-parser.jay" { lexer.parsing_generic_declaration = true; } break; -case 359: - case_359(); +case 360: + case_360(); break; -case 361: - case_361(); +case 362: + case_362(); break; -case 363: - case_363(); +case 364: + case_364(); break; -case 365: -#line 2977 "cs-parser.jay" +case 366: +#line 2974 "cs-parser.jay" { yyVal = new ComposedCast ((FullNamedExpression) yyVals[-1+yyTop], (ComposedTypeSpecifier) yyVals[0+yyTop]); } break; -case 366: - case_366(); - break; case 367: -#line 2996 "cs-parser.jay" + case_367(); + break; +case 368: +#line 2993 "cs-parser.jay" { yyVal = new ComposedCast ((ATypeNameExpression) yyVals[-1+yyTop], (ComposedTypeSpecifier) yyVals[0+yyTop]); } break; -case 368: - case_368(); - break; case 369: -#line 3005 "cs-parser.jay" + case_369(); + break; +case 370: +#line 3002 "cs-parser.jay" { yyVal = new ComposedCast ((FullNamedExpression) yyVals[-1+yyTop], (ComposedTypeSpecifier) yyVals[0+yyTop]); } break; -case 370: -#line 3009 "cs-parser.jay" +case 371: +#line 3006 "cs-parser.jay" { yyVal = new ComposedCast (new TypeExpression (compiler.BuiltinTypes.Void, GetLocation (yyVals[-1+yyTop])), (ComposedTypeSpecifier) yyVals[0+yyTop]); } break; -case 371: - case_371(); - break; case 372: case_372(); break; @@ -2470,95 +2476,95 @@ case 373: case_373(); break; case 374: -#line 3043 "cs-parser.jay" - { yyVal = new TypeExpression (compiler.BuiltinTypes.Object, GetLocation (yyVals[0+yyTop])); } + case_374(); break; case 375: -#line 3044 "cs-parser.jay" - { yyVal = new TypeExpression (compiler.BuiltinTypes.String, GetLocation (yyVals[0+yyTop])); } +#line 3040 "cs-parser.jay" + { yyVal = new TypeExpression (compiler.BuiltinTypes.Object, GetLocation (yyVals[0+yyTop])); } break; case 376: -#line 3045 "cs-parser.jay" - { yyVal = new TypeExpression (compiler.BuiltinTypes.Bool, GetLocation (yyVals[0+yyTop])); } +#line 3041 "cs-parser.jay" + { yyVal = new TypeExpression (compiler.BuiltinTypes.String, GetLocation (yyVals[0+yyTop])); } break; case 377: -#line 3046 "cs-parser.jay" - { yyVal = new TypeExpression (compiler.BuiltinTypes.Decimal, GetLocation (yyVals[0+yyTop])); } +#line 3042 "cs-parser.jay" + { yyVal = new TypeExpression (compiler.BuiltinTypes.Bool, GetLocation (yyVals[0+yyTop])); } break; case 378: -#line 3047 "cs-parser.jay" - { yyVal = new TypeExpression (compiler.BuiltinTypes.Float, GetLocation (yyVals[0+yyTop])); } +#line 3043 "cs-parser.jay" + { yyVal = new TypeExpression (compiler.BuiltinTypes.Decimal, GetLocation (yyVals[0+yyTop])); } break; case 379: -#line 3048 "cs-parser.jay" +#line 3044 "cs-parser.jay" + { yyVal = new TypeExpression (compiler.BuiltinTypes.Float, GetLocation (yyVals[0+yyTop])); } + break; +case 380: +#line 3045 "cs-parser.jay" { yyVal = new TypeExpression (compiler.BuiltinTypes.Double, GetLocation (yyVals[0+yyTop])); } break; -case 381: -#line 3053 "cs-parser.jay" +case 382: +#line 3050 "cs-parser.jay" { yyVal = new TypeExpression (compiler.BuiltinTypes.SByte, GetLocation (yyVals[0+yyTop])); } break; -case 382: -#line 3054 "cs-parser.jay" +case 383: +#line 3051 "cs-parser.jay" { yyVal = new TypeExpression (compiler.BuiltinTypes.Byte, GetLocation (yyVals[0+yyTop])); } break; -case 383: -#line 3055 "cs-parser.jay" +case 384: +#line 3052 "cs-parser.jay" { yyVal = new TypeExpression (compiler.BuiltinTypes.Short, GetLocation (yyVals[0+yyTop])); } break; -case 384: -#line 3056 "cs-parser.jay" +case 385: +#line 3053 "cs-parser.jay" { yyVal = new TypeExpression (compiler.BuiltinTypes.UShort, GetLocation (yyVals[0+yyTop])); } break; -case 385: -#line 3057 "cs-parser.jay" +case 386: +#line 3054 "cs-parser.jay" { yyVal = new TypeExpression (compiler.BuiltinTypes.Int, GetLocation (yyVals[0+yyTop])); } break; -case 386: -#line 3058 "cs-parser.jay" +case 387: +#line 3055 "cs-parser.jay" { yyVal = new TypeExpression (compiler.BuiltinTypes.UInt, GetLocation (yyVals[0+yyTop])); } break; -case 387: -#line 3059 "cs-parser.jay" +case 388: +#line 3056 "cs-parser.jay" { yyVal = new TypeExpression (compiler.BuiltinTypes.Long, GetLocation (yyVals[0+yyTop])); } break; -case 388: -#line 3060 "cs-parser.jay" +case 389: +#line 3057 "cs-parser.jay" { yyVal = new TypeExpression (compiler.BuiltinTypes.ULong, GetLocation (yyVals[0+yyTop])); } break; -case 389: -#line 3061 "cs-parser.jay" +case 390: +#line 3058 "cs-parser.jay" { yyVal = new TypeExpression (compiler.BuiltinTypes.Char, GetLocation (yyVals[0+yyTop])); } break; -case 410: - case_410(); - break; case 411: case_411(); break; -case 415: -#line 3108 "cs-parser.jay" - { yyVal = new NullLiteral (GetLocation (yyVals[0+yyTop])); } +case 412: + case_412(); break; case 416: -#line 3112 "cs-parser.jay" - { yyVal = new BoolLiteral (compiler.BuiltinTypes, true, GetLocation (yyVals[0+yyTop])); } +#line 3105 "cs-parser.jay" + { yyVal = new NullLiteral (GetLocation (yyVals[0+yyTop])); } break; case 417: -#line 3113 "cs-parser.jay" - { yyVal = new BoolLiteral (compiler.BuiltinTypes, false, GetLocation (yyVals[0+yyTop])); } +#line 3109 "cs-parser.jay" + { yyVal = new BoolLiteral (compiler.BuiltinTypes, true, GetLocation (yyVals[0+yyTop])); } break; -case 422: - case_422(); +case 418: +#line 3110 "cs-parser.jay" + { yyVal = new BoolLiteral (compiler.BuiltinTypes, false, GetLocation (yyVals[0+yyTop])); } break; case 423: -#line 3146 "cs-parser.jay" + case_423(); + break; +case 424: +#line 3143 "cs-parser.jay" { yyVal = new ParenthesizedExpression ((Expression) yyVals[-1+yyTop]); } break; -case 424: - case_424(); - break; case 425: case_425(); break; @@ -2569,49 +2575,49 @@ case 427: case_427(); break; case 428: -#line 3181 "cs-parser.jay" + case_428(); + break; +case 429: +#line 3178 "cs-parser.jay" { yyVal = new CompletionMemberAccess ((Expression) yyVals[-2+yyTop], null,GetLocation (yyVals[0+yyTop])); } break; -case 429: - case_429(); - break; case 430: -#line 3189 "cs-parser.jay" + case_430(); + break; +case 431: +#line 3186 "cs-parser.jay" { yyVal = new CompletionMemberAccess ((Expression) yyVals[-2+yyTop], null, lexer.Location); } break; -case 431: - case_431(); - break; case 432: case_432(); break; case 433: -#line 3205 "cs-parser.jay" - { yyVal = null; } + case_433(); break; -case 435: - case_435(); +case 434: +#line 3202 "cs-parser.jay" + { yyVal = null; } break; case 436: case_436(); break; case 437: -#line 3228 "cs-parser.jay" - { yyVal = null; } + case_437(); break; case 438: -#line 3232 "cs-parser.jay" +#line 3225 "cs-parser.jay" + { yyVal = null; } + break; +case 439: +#line 3229 "cs-parser.jay" { yyVal = yyVals[0+yyTop]; } break; -case 439: - case_439(); - break; case 440: case_440(); break; @@ -2622,26 +2628,26 @@ case 442: case_442(); break; case 443: -#line 3265 "cs-parser.jay" + case_443(); + break; +case 444: +#line 3262 "cs-parser.jay" { yyVal = new CompletionElementInitializer (null, GetLocation (yyVals[0+yyTop])); } break; -case 444: - case_444(); - break; case 445: case_445(); break; case 446: case_446(); break; -case 449: -#line 3295 "cs-parser.jay" - { yyVal = null; } +case 447: + case_447(); break; -case 451: - case_451(); +case 450: +#line 3292 "cs-parser.jay" + { yyVal = null; } break; case 452: case_452(); @@ -2656,14 +2662,14 @@ case 455: case_455(); break; case 456: -#line 3347 "cs-parser.jay" + case_456(); + break; +case 457: +#line 3344 "cs-parser.jay" { yyVal = new Argument ((Expression) yyVals[0+yyTop]); } break; -case 460: - case_460(); - break; case 461: case_461(); break; @@ -2673,20 +2679,14 @@ case 462: case 463: case_463(); break; -case 465: - case_465(); +case 464: + case_464(); break; case 466: -#line 3392 "cs-parser.jay" - { - yyVal = new ElementAccess ((Expression) yyVals[-3+yyTop], (Arguments) yyVals[-1+yyTop], GetLocation (yyVals[-2+yyTop])); - } + case_466(); break; case 467: -#line 3396 "cs-parser.jay" - { - yyVal = new ElementAccess ((Expression) yyVals[-2+yyTop], null, GetLocation (yyVals[-1+yyTop])); - } + case_467(); break; case 468: case_468(); @@ -2704,38 +2704,38 @@ case 472: case_472(); break; case 473: -#line 3442 "cs-parser.jay" + case_473(); + break; +case 474: +#line 3441 "cs-parser.jay" { yyVal = new Argument ((Expression) yyVals[0+yyTop]); } break; -case 475: -#line 3450 "cs-parser.jay" +case 476: +#line 3449 "cs-parser.jay" { yyVal = new This (GetLocation (yyVals[0+yyTop])); } break; -case 476: - case_476(); - break; case 477: case_477(); break; case 478: -#line 3470 "cs-parser.jay" + case_478(); + break; +case 479: +#line 3469 "cs-parser.jay" { yyVal = new UnaryMutator (UnaryMutator.Mode.PostIncrement, (Expression) yyVals[-1+yyTop], GetLocation (yyVals[0+yyTop])); } break; -case 479: -#line 3477 "cs-parser.jay" +case 480: +#line 3476 "cs-parser.jay" { yyVal = new UnaryMutator (UnaryMutator.Mode.PostDecrement, (Expression) yyVals[-1+yyTop], GetLocation (yyVals[0+yyTop])); } break; -case 480: - case_480(); - break; case 481: case_481(); break; @@ -2755,24 +2755,24 @@ case 486: case_486(); break; case 487: + case_487(); + break; +case 488: #line 3543 "cs-parser.jay" { ++lexer.parsing_type; } break; -case 488: - case_488(); - break; case 489: case_489(); break; -case 492: +case 490: + case_490(); + break; +case 493: #line 3570 "cs-parser.jay" { yyVal = null; } break; -case 494: - case_494(); - break; case 495: case_495(); break; @@ -2788,8 +2788,8 @@ case 498: case 499: case_499(); break; -case 503: - case_503(); +case 500: + case_500(); break; case 504: case_504(); @@ -2798,32 +2798,32 @@ case 505: case_505(); break; case 506: + case_506(); + break; +case 507: #line 3648 "cs-parser.jay" { yyVal = 2; } break; -case 507: +case 508: #line 3652 "cs-parser.jay" { yyVal = ((int) yyVals[-1+yyTop]) + 1; } break; -case 508: +case 509: #line 3659 "cs-parser.jay" { yyVal = null; } break; -case 509: +case 510: #line 3663 "cs-parser.jay" { yyVal = yyVals[0+yyTop]; } break; -case 510: - case_510(); - break; case 511: case_511(); break; @@ -2834,16 +2834,16 @@ case 513: case_513(); break; case 514: + case_514(); + break; +case 515: #line 3707 "cs-parser.jay" { lexer.TypeOfParsing = true; } break; -case 515: - case_515(); - break; -case 518: - case_518(); +case 516: + case_516(); break; case 519: case_519(); @@ -2879,136 +2879,136 @@ case 529: case_529(); break; case 530: + case_530(); + break; +case 531: #line 3827 "cs-parser.jay" { start_anonymous (false, (ParametersCompiled) yyVals[0+yyTop], false, GetLocation (yyVals[-1+yyTop])); } break; -case 531: - case_531(); - break; case 532: + case_532(); + break; +case 533: #line 3840 "cs-parser.jay" { start_anonymous (false, (ParametersCompiled) yyVals[0+yyTop], true, GetLocation (yyVals[-2+yyTop])); } break; -case 533: - case_533(); - break; case 534: + case_534(); + break; +case 535: #line 3857 "cs-parser.jay" { yyVal = ParametersCompiled.Undefined; } break; -case 536: +case 537: #line 3865 "cs-parser.jay" { valid_param_mod = ParameterModifierType.Ref | ParameterModifierType.Out; } break; -case 537: - case_537(); - break; case 538: case_538(); break; -case 540: +case 539: + case_539(); + break; +case 541: #line 3891 "cs-parser.jay" { yyVal = new Unary (Unary.Operator.LogicalNot, (Expression) yyVals[0+yyTop], GetLocation (yyVals[-1+yyTop])); } break; -case 541: +case 542: #line 3895 "cs-parser.jay" { yyVal = new Unary (Unary.Operator.OnesComplement, (Expression) yyVals[0+yyTop], GetLocation (yyVals[-1+yyTop])); } break; -case 542: - case_542(); - break; case 543: case_543(); break; -case 545: -#line 3923 "cs-parser.jay" +case 544: + case_544(); + break; +case 546: +#line 3931 "cs-parser.jay" { yyVal = new Unary (Unary.Operator.UnaryPlus, (Expression) yyVals[0+yyTop], GetLocation (yyVals[-1+yyTop])); } break; -case 546: -#line 3927 "cs-parser.jay" +case 547: +#line 3935 "cs-parser.jay" { yyVal = new Unary (Unary.Operator.UnaryNegation, (Expression) yyVals[0+yyTop], GetLocation (yyVals[-1+yyTop])); } break; -case 547: -#line 3931 "cs-parser.jay" +case 548: +#line 3939 "cs-parser.jay" { yyVal = new UnaryMutator (UnaryMutator.Mode.PreIncrement, (Expression) yyVals[0+yyTop], GetLocation (yyVals[-1+yyTop])); } break; -case 548: -#line 3935 "cs-parser.jay" +case 549: +#line 3943 "cs-parser.jay" { yyVal = new UnaryMutator (UnaryMutator.Mode.PreDecrement, (Expression) yyVals[0+yyTop], GetLocation (yyVals[-1+yyTop])); } break; -case 549: -#line 3939 "cs-parser.jay" +case 550: +#line 3947 "cs-parser.jay" { yyVal = new Indirection ((Expression) yyVals[0+yyTop], GetLocation (yyVals[-1+yyTop])); } break; -case 550: -#line 3943 "cs-parser.jay" +case 551: +#line 3951 "cs-parser.jay" { yyVal = new Unary (Unary.Operator.AddressOf, (Expression) yyVals[0+yyTop], GetLocation (yyVals[-1+yyTop])); } break; -case 552: - case_552(); - break; case 553: case_553(); break; case 554: case_554(); break; -case 556: - case_556(); +case 555: + case_555(); break; case 557: -#line 3975 "cs-parser.jay" + case_557(); + break; +case 558: +#line 3983 "cs-parser.jay" { yyVal = new Binary (Binary.Operator.Subtraction, (Expression) yyVals[-2+yyTop], (Expression) yyVals[0+yyTop], GetLocation (yyVals[-1+yyTop])); } break; -case 558: - case_558(); - break; case 559: -#line 3984 "cs-parser.jay" + case_559(); + break; +case 560: +#line 3992 "cs-parser.jay" { yyVal = new As ((Expression) yyVals[-2+yyTop], (Expression) yyVals[0+yyTop], GetLocation (yyVals[-1+yyTop])); } break; -case 560: -#line 3988 "cs-parser.jay" +case 561: +#line 3996 "cs-parser.jay" { yyVal = new Is ((Expression) yyVals[-2+yyTop], (Expression) yyVals[0+yyTop], GetLocation (yyVals[-1+yyTop])); } break; -case 562: - case_562(); - break; case 563: case_563(); break; -case 565: - case_565(); +case 564: + case_564(); break; case 566: case_566(); @@ -3019,44 +3019,44 @@ case 567: case 568: case_568(); break; -case 570: - case_570(); +case 569: + case_569(); break; case 571: case_571(); break; -case 573: - case_573(); +case 572: + case_572(); break; -case 575: - case_575(); +case 574: + case_574(); break; -case 577: - case_577(); +case 576: + case_576(); break; -case 579: - case_579(); +case 578: + case_578(); break; -case 581: - case_581(); +case 580: + case_580(); break; -case 583: - case_583(); +case 582: + case_582(); break; -case 585: - case_585(); +case 584: + case_584(); break; case 586: -#line 4112 "cs-parser.jay" - { - yyVal = new SimpleAssign ((Expression) yyVals[-2+yyTop], (Expression) yyVals[0+yyTop], GetLocation (yyVals[-1+yyTop])); - } + case_586(); break; case 587: case_587(); break; case 588: - case_588(); +#line 4125 "cs-parser.jay" + { + yyVal = new SimpleAssign ((Expression) yyVals[-2+yyTop], (Expression) yyVals[0+yyTop], GetLocation (yyVals[-1+yyTop])); + } break; case 589: case_589(); @@ -3098,27 +3098,27 @@ case 601: case_601(); break; case 602: -#line 4209 "cs-parser.jay" - { yyVal = ParametersCompiled.EmptyReadOnlyParameters; } + case_602(); break; case 603: case_603(); break; -case 606: -#line 4225 "cs-parser.jay" +case 604: +#line 4222 "cs-parser.jay" + { yyVal = ParametersCompiled.EmptyReadOnlyParameters; } + break; +case 605: + case_605(); + break; +case 608: +#line 4238 "cs-parser.jay" { start_block (Location.Null); } break; -case 607: - case_607(); - break; case 609: case_609(); break; -case 610: - case_610(); - break; case 611: case_611(); break; @@ -3129,62 +3129,62 @@ case 613: case_613(); break; case 614: -#line 4270 "cs-parser.jay" - { - valid_param_mod = ParameterModifierType.Ref | ParameterModifierType.Out; - } + case_614(); break; case 615: case_615(); break; case 616: - case_616(); - break; -case 617: -#line 4284 "cs-parser.jay" +#line 4283 "cs-parser.jay" { - valid_param_mod = ParameterModifierType.Ref | ParameterModifierType.Out; + valid_param_mod = ParameterModifierType.Ref | ParameterModifierType.Out; } break; +case 617: + case_617(); + break; case 618: case_618(); break; case 619: - case_619(); - break; -case 625: -#line 4309 "cs-parser.jay" +#line 4297 "cs-parser.jay" { - yyVal = new ArglistAccess (GetLocation (yyVals[0+yyTop])); + valid_param_mod = ParameterModifierType.Ref | ParameterModifierType.Out; } break; -case 626: - case_626(); +case 620: + case_620(); + break; +case 621: + case_621(); break; case 627: - case_627(); +#line 4322 "cs-parser.jay" + { + yyVal = new ArglistAccess (GetLocation (yyVals[0+yyTop])); + } break; case 628: case_628(); break; +case 629: + case_629(); + break; case 630: -#line 4338 "cs-parser.jay" + case_630(); + break; +case 632: +#line 4351 "cs-parser.jay" { yyVal = new BooleanExpression ((Expression) yyVals[0+yyTop]); } break; -case 631: -#line 4351 "cs-parser.jay" +case 633: +#line 4364 "cs-parser.jay" { lexer.ConstraintsParsing = true; } break; -case 632: - case_632(); - break; -case 633: - case_633(); - break; case 634: case_634(); break; @@ -3192,28 +3192,28 @@ case 635: case_635(); break; case 636: -#line 4396 "cs-parser.jay" - { yyVal = null; } + case_636(); break; case 637: -#line 4398 "cs-parser.jay" - { yyVal = yyVals[0+yyTop]; StoreModifierLocation (Modifiers.PARTIAL, GetLocation (yyVals[0+yyTop])); } + case_637(); break; case 638: - case_638(); +#line 4409 "cs-parser.jay" + { yyVal = null; } break; case 639: #line 4411 "cs-parser.jay" + { yyVal = yyVals[0+yyTop]; StoreModifierLocation (Modifiers.PARTIAL, GetLocation (yyVals[0+yyTop])); } + break; +case 640: + case_640(); + break; +case 641: +#line 4424 "cs-parser.jay" { lexer.parsing_modifiers = false; } break; -case 641: - case_641(); - break; -case 642: - case_642(); - break; case 643: case_643(); break; @@ -3256,24 +3256,24 @@ case 655: case 656: case_656(); break; +case 657: + case_657(); + break; case 658: case_658(); break; -case 659: - case_659(); +case 660: + case_660(); break; case 661: -#line 4537 "cs-parser.jay" + case_661(); + break; +case 663: +#line 4550 "cs-parser.jay" { yyVal = yyVals[0+yyTop]; } break; -case 662: - case_662(); - break; -case 663: - case_663(); - break; case 664: case_664(); break; @@ -3293,29 +3293,29 @@ case 669: case_669(); break; case 670: -#line 4630 "cs-parser.jay" + case_670(); + break; +case 671: + case_671(); + break; +case 672: +#line 4643 "cs-parser.jay" { yyVal = new SpecialContraintExpr (SpecialConstraint.Class, GetLocation (yyVals[0+yyTop])); } break; -case 671: -#line 4634 "cs-parser.jay" +case 673: +#line 4647 "cs-parser.jay" { yyVal = new SpecialContraintExpr (SpecialConstraint.Struct, GetLocation (yyVals[0+yyTop])); } break; -case 672: -#line 4641 "cs-parser.jay" +case 674: +#line 4654 "cs-parser.jay" { yyVal = Variance.None; } break; -case 673: - case_673(); - break; -case 674: - case_674(); - break; case 675: case_675(); break; @@ -3323,16 +3323,16 @@ case 676: case_676(); break; case 677: -#line 4686 "cs-parser.jay" - { - yyVal = yyVals[0+yyTop]; - } + case_677(); break; case 678: case_678(); break; case 679: - case_679(); +#line 4699 "cs-parser.jay" + { + yyVal = yyVals[0+yyTop]; + } break; case 680: case_680(); @@ -3343,42 +3343,42 @@ case 681: case 682: case_682(); break; -case 687: -#line 4735 "cs-parser.jay" +case 683: + case_683(); + break; +case 684: + case_684(); + break; +case 689: +#line 4748 "cs-parser.jay" { current_block.AddStatement ((Statement) yyVals[0+yyTop]); } break; -case 688: -#line 4739 "cs-parser.jay" +case 690: +#line 4752 "cs-parser.jay" { current_block.AddStatement ((Statement) yyVals[0+yyTop]); } break; -case 690: - case_690(); +case 692: + case_692(); break; -case 691: - case_691(); +case 693: + case_693(); break; -case 694: -#line 4773 "cs-parser.jay" +case 696: +#line 4786 "cs-parser.jay" { current_block.AddStatement ((Statement) yyVals[0+yyTop]); } break; -case 695: -#line 4777 "cs-parser.jay" +case 697: +#line 4790 "cs-parser.jay" { current_block.AddStatement ((Statement) yyVals[0+yyTop]); } break; -case 724: - case_724(); - break; -case 725: - case_725(); - break; case 726: case_726(); break; @@ -3388,11 +3388,11 @@ case 727: case 728: case_728(); break; -case 731: - case_731(); +case 729: + case_729(); break; -case 732: - case_732(); +case 730: + case_730(); break; case 733: case_733(); @@ -3401,35 +3401,35 @@ case 734: case_734(); break; case 735: -#line 4921 "cs-parser.jay" + case_735(); + break; +case 736: + case_736(); + break; +case 737: +#line 4934 "cs-parser.jay" { yyVal = new ComposedCast ((FullNamedExpression) yyVals[-1+yyTop], (ComposedTypeSpecifier) yyVals[0+yyTop]); } break; -case 736: -#line 4925 "cs-parser.jay" +case 738: +#line 4938 "cs-parser.jay" { yyVal = new ComposedCast (new TypeExpression (compiler.BuiltinTypes.Void, GetLocation (yyVals[-1+yyTop])), (ComposedTypeSpecifier) yyVals[0+yyTop]); } break; -case 737: - case_737(); - break; case 739: case_739(); break; -case 740: -#line 4946 "cs-parser.jay" +case 741: + case_741(); + break; +case 742: +#line 4959 "cs-parser.jay" { yyVal = ComposedTypeSpecifier.CreatePointer (GetLocation (yyVals[0+yyTop])); } break; -case 742: - case_742(); - break; -case 743: - case_743(); - break; case 744: case_744(); break; @@ -3439,140 +3439,140 @@ case 745: case 746: case_746(); break; +case 747: + case_747(); + break; case 748: case_748(); break; case 750: case_750(); break; -case 751: - case_751(); - break; case 752: case_752(); break; -case 756: - case_756(); +case 753: + case_753(); break; -case 759: - case_759(); +case 754: + case_754(); break; -case 760: - case_760(); +case 758: + case_758(); break; case 761: -#line 5081 "cs-parser.jay" - { - report.Error (145, lexer.Location, "A const field requires a value to be provided"); - } + case_761(); break; case 762: case_762(); break; -case 767: - case_767(); +case 763: +#line 5094 "cs-parser.jay" + { + report.Error (145, lexer.Location, "A const field requires a value to be provided"); + } + break; +case 764: + case_764(); break; case 769: case_769(); break; -case 770: - case_770(); - break; case 771: case_771(); break; case 772: -#line 5131 "cs-parser.jay" - { yyVal = yyVals[-1+yyTop]; } + case_772(); break; case 773: case_773(); break; case 774: -#line 5141 "cs-parser.jay" +#line 5144 "cs-parser.jay" { yyVal = yyVals[-1+yyTop]; } break; case 775: -#line 5142 "cs-parser.jay" - { yyVal = yyVals[-1+yyTop]; } + case_775(); break; case 776: - case_776(); +#line 5154 "cs-parser.jay" + { yyVal = yyVals[-1+yyTop]; } break; case 777: - case_777(); +#line 5155 "cs-parser.jay" + { yyVal = yyVals[-1+yyTop]; } break; case 778: case_778(); break; -case 781: - case_781(); +case 779: + case_779(); break; -case 782: - case_782(); +case 780: + case_780(); break; case 783: case_783(); break; case 784: -#line 5217 "cs-parser.jay" - { - start_block (GetLocation (yyVals[0+yyTop])); - } + case_784(); break; case 785: case_785(); break; case 786: - case_786(); +#line 5230 "cs-parser.jay" + { + start_block (GetLocation (yyVals[0+yyTop])); + } break; case 787: case_787(); break; +case 788: + case_788(); + break; case 789: case_789(); break; -case 790: - case_790(); - break; case 791: case_791(); break; case 792: -#line 5268 "cs-parser.jay" + case_792(); + break; +case 793: + case_793(); + break; +case 794: +#line 5281 "cs-parser.jay" { current_block = current_block.CreateSwitchBlock (lexer.Location); } break; -case 793: -#line 5272 "cs-parser.jay" +case 795: +#line 5285 "cs-parser.jay" { yyVal = new SwitchSection ((List) yyVals[-2+yyTop], current_block); } break; -case 794: - case_794(); - break; -case 795: - case_795(); - break; case 796: case_796(); break; case 797: -#line 5301 "cs-parser.jay" - { - yyVal = new SwitchLabel (null, GetLocation (yyVals[0+yyTop])); - } + case_797(); break; -case 802: - case_802(); +case 798: + case_798(); break; -case 803: - case_803(); +case 799: + case_799(); break; -case 804: - case_804(); +case 800: +#line 5319 "cs-parser.jay" + { + yyVal = new SwitchLabel (null, GetLocation (yyVals[0+yyTop])); + } break; case 805: case_805(); @@ -3584,28 +3584,25 @@ case 807: case_807(); break; case 808: -#line 5362 "cs-parser.jay" - { - yyVal = yyVals[0+yyTop]; - } + case_808(); break; case 809: case_809(); break; case 810: -#line 5377 "cs-parser.jay" + case_810(); + break; +case 811: +#line 5380 "cs-parser.jay" { yyVal = yyVals[0+yyTop]; } break; -case 811: - case_811(); - break; case 812: case_812(); break; case 813: -#line 5398 "cs-parser.jay" +#line 5395 "cs-parser.jay" { yyVal = yyVals[0+yyTop]; } @@ -3617,34 +3614,37 @@ case 815: case_815(); break; case 816: - case_816(); +#line 5416 "cs-parser.jay" + { + yyVal = yyVals[0+yyTop]; + } break; case 817: -#line 5431 "cs-parser.jay" - { yyVal = new EmptyStatement (lexer.Location); } + case_817(); + break; +case 818: + case_818(); break; case 819: case_819(); break; case 820: - case_820(); +#line 5449 "cs-parser.jay" + { yyVal = new EmptyStatement (lexer.Location); } break; case 822: -#line 5452 "cs-parser.jay" - { yyVal = null; } + case_822(); break; -case 824: -#line 5457 "cs-parser.jay" - { yyVal = new EmptyStatement (lexer.Location); } - break; -case 828: - case_828(); +case 823: + case_823(); break; -case 829: - case_829(); +case 825: +#line 5470 "cs-parser.jay" + { yyVal = null; } break; -case 830: - case_830(); +case 827: +#line 5475 "cs-parser.jay" + { yyVal = new EmptyStatement (lexer.Location); } break; case 831: case_831(); @@ -3658,14 +3658,14 @@ case 833: case 834: case_834(); break; -case 841: - case_841(); +case 835: + case_835(); break; -case 842: - case_842(); +case 836: + case_836(); break; -case 843: - case_843(); +case 837: + case_837(); break; case 844: case_844(); @@ -3685,11 +3685,14 @@ case 848: case 849: case_849(); break; +case 850: + case_850(); + break; +case 851: + case_851(); + break; case 852: -#line 5658 "cs-parser.jay" - { - yyVal = new TryCatch ((Block) yyVals[-1+yyTop], (List) yyVals[0+yyTop], GetLocation (yyVals[-2+yyTop]), false); - } + case_852(); break; case 853: case_853(); @@ -3700,68 +3703,65 @@ case 854: case 855: case_855(); break; -case 856: - case_856(); +case 858: +#line 5692 "cs-parser.jay" + { + yyVal = new TryCatch ((Block) yyVals[-1+yyTop], (List) yyVals[0+yyTop], GetLocation (yyVals[-2+yyTop]), false); + } break; -case 857: - case_857(); +case 859: + case_859(); break; case 860: -#line 5708 "cs-parser.jay" - { - yyVal = new Catch ((Block) yyVals[0+yyTop], GetLocation (yyVals[-1+yyTop])); - } + case_860(); break; case 861: case_861(); break; case 862: -#line 5727 "cs-parser.jay" - { - yyVal = yyVals[-1+yyTop]; - } + case_862(); break; case 863: case_863(); break; -case 864: -#line 5745 "cs-parser.jay" +case 866: +#line 5742 "cs-parser.jay" { - yyVal = new Checked ((Block) yyVals[0+yyTop], GetLocation (yyVals[-1+yyTop])); - } - break; -case 865: -#line 5752 "cs-parser.jay" - { - yyVal = new Unchecked ((Block) yyVals[0+yyTop], GetLocation (yyVals[-1+yyTop])); + yyVal = new Catch ((Block) yyVals[0+yyTop], GetLocation (yyVals[-1+yyTop])); } break; -case 866: - case_866(); - break; case 867: -#line 5762 "cs-parser.jay" - { - yyVal = new Unsafe ((Block) yyVals[0+yyTop], GetLocation (yyVals[-2+yyTop])); - } + case_867(); break; case 868: - case_868(); +#line 5761 "cs-parser.jay" + { + yyVal = yyVals[-1+yyTop]; + } break; case 869: case_869(); break; case 870: - case_870(); +#line 5779 "cs-parser.jay" + { + yyVal = new Checked ((Block) yyVals[0+yyTop], GetLocation (yyVals[-1+yyTop])); + } break; case 871: - case_871(); +#line 5786 "cs-parser.jay" + { + yyVal = new Unchecked ((Block) yyVals[0+yyTop], GetLocation (yyVals[-1+yyTop])); + } break; case 872: case_872(); break; case 873: - case_873(); +#line 5796 "cs-parser.jay" + { + yyVal = new Unsafe ((Block) yyVals[0+yyTop], GetLocation (yyVals[-2+yyTop])); + } break; case 874: case_874(); @@ -3775,14 +3775,14 @@ case 876: case 877: case_877(); break; +case 878: + case_878(); + break; case 879: case_879(); break; case 880: -#line 5867 "cs-parser.jay" - { - Error_MissingInitializer (lexer.Location); - } + case_880(); break; case 881: case_881(); @@ -3793,14 +3793,14 @@ case 882: case 883: case_883(); break; -case 884: - case_884(); - break; case 885: case_885(); break; case 886: - case_886(); +#line 5901 "cs-parser.jay" + { + Error_MissingInitializer (lexer.Location); + } break; case 887: case_887(); @@ -3812,19 +3812,13 @@ case 889: case_889(); break; case 890: -#line 5972 "cs-parser.jay" - { - current_block = new Linq.QueryBlock (current_block, lexer.Location); - } + case_890(); break; case 891: case_891(); break; case 892: -#line 5988 "cs-parser.jay" - { - current_block = new Linq.QueryBlock (current_block, lexer.Location); - } + case_892(); break; case 893: case_893(); @@ -3832,17 +3826,23 @@ case 893: case 894: case_894(); break; -case 896: - case_896(); +case 895: + case_895(); break; -case 897: -#line 6035 "cs-parser.jay" +case 896: +#line 6006 "cs-parser.jay" { - current_block = new Linq.QueryBlock (current_block, lexer.Location); + current_block = new Linq.QueryBlock (current_block, lexer.Location); } break; +case 897: + case_897(); + break; case 898: - case_898(); +#line 6022 "cs-parser.jay" + { + current_block = new Linq.QueryBlock (current_block, lexer.Location); + } break; case 899: case_899(); @@ -3853,41 +3853,47 @@ case 900: case 901: case_901(); break; -case 905: - case_905(); +case 903: + case_903(); break; -case 911: -#line 6094 "cs-parser.jay" +case 904: + case_904(); + break; +case 905: +#line 6086 "cs-parser.jay" { current_block = new Linq.QueryBlock (current_block, lexer.Location); } break; -case 912: - case_912(); +case 906: + case_906(); break; -case 913: -#line 6113 "cs-parser.jay" - { - current_block = new Linq.QueryBlock (current_block, lexer.Location); - } +case 907: + case_907(); break; -case 914: - case_914(); +case 908: + case_908(); break; -case 915: - case_915(); +case 909: + case_909(); break; -case 916: - case_916(); +case 911: + case_911(); break; case 917: - case_917(); +#line 6140 "cs-parser.jay" + { + current_block = new Linq.QueryBlock (current_block, lexer.Location); + } break; case 918: case_918(); break; case 919: - case_919(); +#line 6159 "cs-parser.jay" + { + current_block = new Linq.QueryBlock (current_block, lexer.Location); + } break; case 920: case_920(); @@ -3898,140 +3904,158 @@ case 921: case 922: case_922(); break; +case 923: + case_923(); + break; case 924: case_924(); break; case 925: -#line 6267 "cs-parser.jay" - { - current_block = new Linq.QueryBlock (current_block, lexer.Location); - } + case_925(); break; case 926: case_926(); break; +case 927: + case_927(); + break; case 928: case_928(); break; -case 929: - case_929(); +case 930: + case_930(); break; case 931: - case_931(); - break; -case 932: - case_932(); - break; -case 933: #line 6313 "cs-parser.jay" { - yyVal = new Linq.OrderByAscending ((Linq.QueryBlock) current_block, (Expression)yyVals[0+yyTop]); + current_block = new Linq.QueryBlock (current_block, lexer.Location); } break; +case 932: + case_932(); + break; case 934: case_934(); break; case 935: case_935(); break; -case 936: -#line 6330 "cs-parser.jay" - { - yyVal = new Linq.ThenByAscending ((Linq.QueryBlock) current_block, (Expression)yyVals[0+yyTop]); - } - break; case 937: case_937(); break; case 938: case_938(); break; +case 939: +#line 6359 "cs-parser.jay" + { + yyVal = new Linq.OrderByAscending ((Linq.QueryBlock) current_block, (Expression)yyVals[0+yyTop]); + } + break; case 940: case_940(); break; case 941: case_941(); break; +case 942: +#line 6376 "cs-parser.jay" + { + yyVal = new Linq.ThenByAscending ((Linq.QueryBlock) current_block, (Expression)yyVals[0+yyTop]); + } + break; +case 943: + case_943(); + break; case 944: case_944(); break; -case 945: - case_945(); +case 946: + case_946(); + break; +case 947: + case_947(); break; -case 953: -#line 6452 "cs-parser.jay" +case 950: + case_950(); + break; +case 951: + case_951(); + break; +case 959: +#line 6498 "cs-parser.jay" { module.DocumentationBuilder.ParsedName = (MemberName) yyVals[0+yyTop]; } break; -case 954: -#line 6459 "cs-parser.jay" +case 960: +#line 6505 "cs-parser.jay" { module.DocumentationBuilder.ParsedParameters = (List)yyVals[0+yyTop]; } break; -case 955: - case_955(); +case 961: + case_961(); break; -case 956: - case_956(); +case 962: + case_962(); break; -case 957: -#line 6476 "cs-parser.jay" +case 963: +#line 6522 "cs-parser.jay" { yyVal = new MemberName ((MemberName) yyVals[-2+yyTop], MemberCache.IndexerNameAlias, Location.Null); } break; -case 958: -#line 6480 "cs-parser.jay" +case 964: +#line 6526 "cs-parser.jay" { valid_param_mod = ParameterModifierType.Ref | ParameterModifierType.Out; } break; -case 959: - case_959(); +case 965: + case_965(); break; -case 960: - case_960(); +case 966: + case_966(); break; -case 961: - case_961(); +case 967: + case_967(); break; -case 962: - case_962(); +case 968: + case_968(); break; -case 964: -#line 6516 "cs-parser.jay" +case 970: +#line 6562 "cs-parser.jay" { yyVal = new MemberName (((MemberName) yyVals[-2+yyTop]), (MemberName) yyVals[0+yyTop]); } break; -case 966: -#line 6524 "cs-parser.jay" +case 972: +#line 6570 "cs-parser.jay" { valid_param_mod = ParameterModifierType.Ref | ParameterModifierType.Out; } break; -case 967: -#line 6528 "cs-parser.jay" +case 973: +#line 6574 "cs-parser.jay" { yyVal = yyVals[-1+yyTop]; } break; -case 968: -#line 6535 "cs-parser.jay" +case 974: +#line 6581 "cs-parser.jay" { yyVal = new List (0); } break; -case 970: - case_970(); +case 976: + case_976(); break; -case 971: - case_971(); +case 977: + case_977(); break; -case 972: - case_972(); +case 978: + case_978(); break; #line default } @@ -4075,11 +4099,13 @@ void case_6() Attributes attrs = (Attributes) yyVals[0+yyTop]; report.Error (1730, attrs.Attrs [0].Location, "Assembly and module attributes must precede all other elements except using clauses and extern alias declarations"); + + current_namespace.UnattachedAttributes = attrs; } } void case_8() -#line 410 "cs-parser.jay" +#line 412 "cs-parser.jay" { if (yyToken == Token.EXTERN_ALIAS) report.Error (439, lexer.Location, "An extern alias declaration must precede all other elements"); @@ -4088,7 +4114,7 @@ void case_8() } void case_13() -#line 430 "cs-parser.jay" +#line 432 "cs-parser.jay" { var lt = (Tokenizer.LocatedToken) yyVals[-2+yyTop]; string s = lt.Value; @@ -4111,14 +4137,14 @@ void case_13() } void case_17() -#line 463 "cs-parser.jay" +#line 465 "cs-parser.jay" { if (doc_support) Lexer.doc_state = XmlCommentState.Allowed; } void case_18() -#line 471 "cs-parser.jay" +#line 473 "cs-parser.jay" { var un = new UsingNamespace ((ATypeNameExpression) yyVals[-1+yyTop], GetLocation (yyVals[-2+yyTop])); current_namespace.AddUsing (un); @@ -4127,7 +4153,7 @@ void case_18() } void case_19() -#line 478 "cs-parser.jay" +#line 480 "cs-parser.jay" { var lt = (Tokenizer.LocatedToken) yyVals[-3+yyTop]; if (lang_version != LanguageVersion.ISO_1 && lt.Value == "global") { @@ -4141,14 +4167,14 @@ void case_19() } void case_20() -#line 490 "cs-parser.jay" +#line 492 "cs-parser.jay" { Error_SyntaxError (yyToken); yyVal = null; } void case_21() -#line 503 "cs-parser.jay" +#line 505 "cs-parser.jay" { Attributes attrs = (Attributes) yyVals[-2+yyTop]; var name = (MemberName) yyVals[0+yyTop]; @@ -4178,14 +4204,14 @@ void case_21() } void case_22() -#line 531 "cs-parser.jay" +#line 533 "cs-parser.jay" { if (doc_support) Lexer.doc_state = XmlCommentState.Allowed; } void case_23() -#line 536 "cs-parser.jay" +#line 538 "cs-parser.jay" { if (yyVals[0+yyTop] != null) lbag.AddLocation (current_container, GetLocation (yyVals[-9+yyTop]), GetLocation (yyVals[-6+yyTop]), GetLocation (yyVals[-1+yyTop]), GetLocation (yyVals[0+yyTop])); @@ -4196,14 +4222,14 @@ void case_23() } void case_24() -#line 548 "cs-parser.jay" +#line 550 "cs-parser.jay" { var lt = (Tokenizer.LocatedToken) yyVals[0+yyTop]; yyVal = new MemberName (lt.Value, lt.Location); } void case_25() -#line 553 "cs-parser.jay" +#line 555 "cs-parser.jay" { var lt = (Tokenizer.LocatedToken) yyVals[0+yyTop]; yyVal = new MemberName ((MemberName) yyVals[-2+yyTop], lt.Value, lt.Location) { @@ -4212,14 +4238,14 @@ void case_25() } void case_26() -#line 560 "cs-parser.jay" +#line 562 "cs-parser.jay" { Error_SyntaxError (yyToken); yyVal = new MemberName ("", lexer.Location); } void case_39() -#line 598 "cs-parser.jay" +#line 600 "cs-parser.jay" { if (yyVals[0+yyTop] != null) { TypeContainer ds = (TypeContainer)yyVals[0+yyTop]; @@ -4240,11 +4266,9 @@ void case_39() } void case_41() -#line 620 "cs-parser.jay" +#line 622 "cs-parser.jay" { -#if FULL_AST current_namespace.UnattachedAttributes = (Attributes) yyVals[-1+yyTop]; -#endif report.Error (1518, lexer.Location, "Attributes must be attached to class, delegate, enum, interface or struct"); lexer.putback ('}'); } @@ -4949,16 +4973,24 @@ void case_169() } void case_170() -#line 1528 "cs-parser.jay" +#line 1525 "cs-parser.jay" { - Error_SyntaxError (yyToken); + Error_SyntaxError (yyToken); + Location l = GetLocation (yyVals[0+yyTop]); + yyVal = new Parameter (null, null, Parameter.Modifier.NONE, (Attributes) yyVals[-1+yyTop], l); + } + +void case_171() +#line 1534 "cs-parser.jay" +{ + Error_SyntaxError (yyToken); Location l = GetLocation (yyVals[0+yyTop]); yyVal = new Parameter ((FullNamedExpression) yyVals[-1+yyTop], null, (Parameter.Modifier) yyVals[-2+yyTop], (Attributes) yyVals[-3+yyTop], l); lbag.AddLocation (yyVal, parameterModifierLocation); } -void case_172() -#line 1543 "cs-parser.jay" +void case_173() +#line 1549 "cs-parser.jay" { --lexer.parsing_block; if (lang_version <= LanguageVersion.V_3) { @@ -4996,8 +5028,8 @@ void case_172() ((Parameter) yyVal).DefaultValue = new DefaultParameterValueExpression ((Expression) yyVals[0+yyTop]); } -void case_176() -#line 1592 "cs-parser.jay" +void case_177() +#line 1598 "cs-parser.jay" { Parameter.Modifier p2 = (Parameter.Modifier)yyVals[0+yyTop]; Parameter.Modifier mod = (Parameter.Modifier)yyVals[-1+yyTop] | p2; @@ -5019,8 +5051,8 @@ void case_176() yyVal = mod; } -void case_177() -#line 1616 "cs-parser.jay" +void case_178() +#line 1622 "cs-parser.jay" { if ((valid_param_mod & ParameterModifierType.Ref) == 0) Error_ParameterModifierNotValid ("ref", GetLocation (yyVals[0+yyTop])); @@ -5028,8 +5060,8 @@ void case_177() yyVal = Parameter.Modifier.REF; } -void case_178() -#line 1623 "cs-parser.jay" +void case_179() +#line 1629 "cs-parser.jay" { if ((valid_param_mod & ParameterModifierType.Out) == 0) Error_ParameterModifierNotValid ("out", GetLocation (yyVals[0+yyTop])); @@ -5037,8 +5069,8 @@ void case_178() yyVal = Parameter.Modifier.OUT; } -void case_179() -#line 1630 "cs-parser.jay" +void case_180() +#line 1636 "cs-parser.jay" { if ((valid_param_mod & ParameterModifierType.This) == 0) Error_ParameterModifierNotValid ("this", GetLocation (yyVals[0+yyTop])); @@ -5049,16 +5081,16 @@ void case_179() yyVal = Parameter.Modifier.This; } -void case_180() -#line 1643 "cs-parser.jay" +void case_181() +#line 1649 "cs-parser.jay" { var lt = (Tokenizer.LocatedToken) yyVals[0+yyTop]; yyVal = new ParamsParameter ((FullNamedExpression) yyVals[-1+yyTop], lt.Value, (Attributes) yyVals[-3+yyTop], lt.Location); lbag.AddLocation (yyVal, savedLocation); } -void case_181() -#line 1649 "cs-parser.jay" +void case_182() +#line 1655 "cs-parser.jay" { report.Error (1751, GetLocation (yyVals[-4+yyTop]), "Cannot specify a default value for a parameter array"); @@ -5067,23 +5099,23 @@ void case_181() lbag.AddLocation (yyVal, savedLocation); } -void case_182() -#line 1657 "cs-parser.jay" +void case_183() +#line 1663 "cs-parser.jay" { Error_SyntaxError (yyToken); yyVal = null; } -void case_183() -#line 1665 "cs-parser.jay" +void case_184() +#line 1671 "cs-parser.jay" { if ((valid_param_mod & ParameterModifierType.Params) == 0) report.Error (1670, (GetLocation (yyVals[0+yyTop])), "The `params' modifier is not allowed in current context"); savedLocation = GetLocation (yyVals[0+yyTop]); } -void case_184() -#line 1671 "cs-parser.jay" +void case_185() +#line 1677 "cs-parser.jay" { Parameter.Modifier mod = (Parameter.Modifier)yyVals[0+yyTop]; if ((mod & Parameter.Modifier.This) != 0) { @@ -5094,22 +5126,22 @@ void case_184() savedLocation = GetLocation (yyVals[-1+yyTop]); } -void case_186() -#line 1688 "cs-parser.jay" +void case_187() +#line 1694 "cs-parser.jay" { if ((valid_param_mod & ParameterModifierType.Arglist) == 0) report.Error (1669, GetLocation (yyVals[0+yyTop]), "__arglist is not valid in this context"); } -void case_187() -#line 1699 "cs-parser.jay" +void case_188() +#line 1705 "cs-parser.jay" { if (doc_support) tmpComment = Lexer.consume_doc_comment (); } -void case_188() -#line 1704 "cs-parser.jay" +void case_189() +#line 1710 "cs-parser.jay" { var type = (FullNamedExpression) yyVals[-3+yyTop]; current_property = new Property (current_type, type, (Modifiers) yyVals[-4+yyTop], @@ -5124,8 +5156,8 @@ void case_188() lexer.PropertyParsing = true; } -void case_189() -#line 1718 "cs-parser.jay" +void case_190() +#line 1724 "cs-parser.jay" { lexer.PropertyParsing = false; @@ -5133,15 +5165,15 @@ void case_189() current_property.DocComment = ConsumeStoredComment (); } -void case_190() -#line 1725 "cs-parser.jay" +void case_191() +#line 1731 "cs-parser.jay" { lbag.AppendToMember (current_property, GetLocation (yyVals[0+yyTop])); current_property = null; } -void case_192() -#line 1739 "cs-parser.jay" +void case_193() +#line 1745 "cs-parser.jay" { valid_param_mod = 0; var type = (FullNamedExpression) yyVals[-6+yyTop]; @@ -5167,8 +5199,8 @@ void case_192() lexer.PropertyParsing = true; } -void case_194() -#line 1768 "cs-parser.jay" +void case_195() +#line 1774 "cs-parser.jay" { if (current_property.AccessorFirst != null && current_property.AccessorFirst.Block == null) ((Indexer) current_property).ParameterInfo.CheckParameters (current_property); @@ -5180,8 +5212,8 @@ void case_194() current_property = null; } -void case_199() -#line 1787 "cs-parser.jay" +void case_200() +#line 1793 "cs-parser.jay" { if (yyToken == Token.CLOSE_BRACE) { report.Error (548, lexer.Location, "`{0}': property or indexer must have at least one accessor", current_property.GetSignatureForError ()); @@ -5193,8 +5225,8 @@ void case_199() } } -void case_200() -#line 1801 "cs-parser.jay" +void case_201() +#line 1807 "cs-parser.jay" { if (yyVals[-1+yyTop] != ModifierNone && lang_version == LanguageVersion.ISO_1) { FeatureIsNotAvailable (GetLocation (yyVals[-1+yyTop]), "access modifiers on properties"); @@ -5216,8 +5248,8 @@ void case_200() lexer.PropertyParsing = false; } -void case_201() -#line 1822 "cs-parser.jay" +void case_202() +#line 1828 "cs-parser.jay" { if (yyVals[0+yyTop] != null) { current_property.Get.Block = (ToplevelBlock) yyVals[0+yyTop]; @@ -5239,8 +5271,8 @@ void case_201() Lexer.doc_state = XmlCommentState.NotAllowed; } -void case_202() -#line 1846 "cs-parser.jay" +void case_203() +#line 1852 "cs-parser.jay" { if (yyVals[-1+yyTop] != ModifierNone && lang_version == LanguageVersion.ISO_1) { FeatureIsNotAvailable (GetLocation (yyVals[-1+yyTop]), "access modifiers on properties"); @@ -5267,8 +5299,8 @@ void case_202() lexer.PropertyParsing = false; } -void case_203() -#line 1872 "cs-parser.jay" +void case_204() +#line 1878 "cs-parser.jay" { if (yyVals[0+yyTop] != null) { current_property.Set.Block = (ToplevelBlock) yyVals[0+yyTop]; @@ -5290,29 +5322,29 @@ void case_203() Lexer.doc_state = XmlCommentState.NotAllowed; } -void case_205() -#line 1897 "cs-parser.jay" +void case_206() +#line 1903 "cs-parser.jay" { savedLocation = GetLocation (yyVals[0+yyTop]); yyVal = null; } -void case_206() -#line 1902 "cs-parser.jay" +void case_207() +#line 1908 "cs-parser.jay" { Error_SyntaxError (1043, yyToken, "Invalid accessor body"); yyVal = null; } -void case_208() -#line 1917 "cs-parser.jay" +void case_209() +#line 1923 "cs-parser.jay" { push_current_container (new Interface (current_container, (MemberName) yyVals[0+yyTop], (Modifiers) yyVals[-4+yyTop], (Attributes) yyVals[-5+yyTop]), yyVals[-3+yyTop]); lbag.AddMember (current_container, GetModifierLocations (), GetLocation (yyVals[-2+yyTop])); } -void case_209() -#line 1923 "cs-parser.jay" +void case_210() +#line 1929 "cs-parser.jay" { lexer.ConstraintsParsing = false; @@ -5327,16 +5359,16 @@ void case_209() lexer.parsing_modifiers = true; } -void case_210() -#line 1937 "cs-parser.jay" +void case_211() +#line 1943 "cs-parser.jay" { --lexer.parsing_declaration; if (doc_support) Lexer.doc_state = XmlCommentState.Allowed; } -void case_211() -#line 1943 "cs-parser.jay" +void case_212() +#line 1949 "cs-parser.jay" { if (yyVals[0+yyTop] == null) { lbag.AppendToMember (current_container, GetLocation (yyVals[-4+yyTop]), GetLocation (yyVals[-2+yyTop])); @@ -5346,8 +5378,8 @@ void case_211() yyVal = pop_current_class (); } -void case_227() -#line 2005 "cs-parser.jay" +void case_228() +#line 2011 "cs-parser.jay" { OperatorDeclaration decl = (OperatorDeclaration) yyVals[-2+yyTop]; if (decl != null) { @@ -5376,15 +5408,15 @@ void case_227() current_local_parameters = null; } -void case_231() -#line 2042 "cs-parser.jay" +void case_232() +#line 2048 "cs-parser.jay" { report.Error (590, GetLocation (yyVals[0+yyTop]), "User-defined operators cannot return void"); yyVal = new TypeExpression (compiler.BuiltinTypes.Void, GetLocation (yyVals[0+yyTop])); } -void case_233() -#line 2054 "cs-parser.jay" +void case_234() +#line 2060 "cs-parser.jay" { valid_param_mod = 0; @@ -5425,8 +5457,8 @@ void case_233() lbag.AddLocation (yyVal, GetLocation (yyVals[-5+yyTop]), savedOperatorLocation, GetLocation (yyVals[-3+yyTop]), GetLocation (yyVals[0+yyTop])); } -void case_258() -#line 2130 "cs-parser.jay" +void case_259() +#line 2136 "cs-parser.jay" { valid_param_mod = 0; @@ -5442,8 +5474,8 @@ void case_258() lbag.AddLocation (yyVal, GetLocation (yyVals[-6+yyTop]), GetLocation (yyVals[-5+yyTop]), GetLocation (yyVals[-3+yyTop]), GetLocation (yyVals[0+yyTop])); } -void case_260() -#line 2149 "cs-parser.jay" +void case_261() +#line 2155 "cs-parser.jay" { valid_param_mod = 0; @@ -5459,24 +5491,24 @@ void case_260() lbag.AddLocation (yyVal, GetLocation (yyVals[-6+yyTop]), GetLocation (yyVals[-5+yyTop]), GetLocation (yyVals[-3+yyTop]), GetLocation (yyVals[0+yyTop])); } -void case_261() -#line 2164 "cs-parser.jay" +void case_262() +#line 2170 "cs-parser.jay" { Error_SyntaxError (yyToken); current_local_parameters = ParametersCompiled.EmptyReadOnlyParameters; yyVal = new OperatorDeclaration (Operator.OpType.Implicit, null, GetLocation (yyVals[-1+yyTop])); } -void case_262() -#line 2170 "cs-parser.jay" +void case_263() +#line 2176 "cs-parser.jay" { Error_SyntaxError (yyToken); current_local_parameters = ParametersCompiled.EmptyReadOnlyParameters; yyVal = new OperatorDeclaration (Operator.OpType.Explicit, null, GetLocation (yyVals[-1+yyTop])); } -void case_263() -#line 2180 "cs-parser.jay" +void case_264() +#line 2186 "cs-parser.jay" { Constructor c = (Constructor) yyVals[-1+yyTop]; c.Block = (ToplevelBlock) yyVals[0+yyTop]; @@ -5489,8 +5521,8 @@ void case_263() Lexer.doc_state = XmlCommentState.Allowed; } -void case_264() -#line 2197 "cs-parser.jay" +void case_265() +#line 2203 "cs-parser.jay" { if (doc_support) { tmpComment = Lexer.consume_doc_comment (); @@ -5500,8 +5532,8 @@ void case_264() valid_param_mod = ParameterModifierType.All; } -void case_265() -#line 2206 "cs-parser.jay" +void case_266() +#line 2212 "cs-parser.jay" { valid_param_mod = 0; current_local_parameters = (ParametersCompiled) yyVals[-1+yyTop]; @@ -5531,8 +5563,8 @@ void case_265() start_block (lexer.Location); } -void case_266() -#line 2235 "cs-parser.jay" +void case_267() +#line 2241 "cs-parser.jay" { if (yyVals[0+yyTop] != null) { var c = (Constructor) yyVals[-1+yyTop]; @@ -5548,39 +5580,39 @@ void case_266() yyVal = yyVals[-1+yyTop]; } -void case_272() -#line 2267 "cs-parser.jay" +void case_273() +#line 2273 "cs-parser.jay" { --lexer.parsing_block; yyVal = new ConstructorBaseInitializer ((Arguments) yyVals[-1+yyTop], GetLocation (yyVals[-4+yyTop])); lbag.AddLocation (yyVal, GetLocation (yyVals[-5+yyTop]), GetLocation (yyVals[-3+yyTop]), GetLocation (yyVals[0+yyTop])); } -void case_274() -#line 2277 "cs-parser.jay" +void case_275() +#line 2283 "cs-parser.jay" { --lexer.parsing_block; yyVal = new ConstructorThisInitializer ((Arguments) yyVals[-1+yyTop], GetLocation (yyVals[-4+yyTop])); lbag.AddLocation (yyVal, GetLocation (yyVals[-5+yyTop]), GetLocation (yyVals[-3+yyTop]), GetLocation (yyVals[0+yyTop])); } -void case_275() -#line 2283 "cs-parser.jay" +void case_276() +#line 2289 "cs-parser.jay" { Error_SyntaxError (yyToken); yyVal = new ConstructorThisInitializer (null, GetLocation (yyVals[0+yyTop])); lbag.AddLocation (yyVal, GetLocation (yyVals[-1+yyTop])); } -void case_276() -#line 2289 "cs-parser.jay" +void case_277() +#line 2295 "cs-parser.jay" { Error_SyntaxError (yyToken); yyVal = null; } -void case_277() -#line 2297 "cs-parser.jay" +void case_278() +#line 2303 "cs-parser.jay" { if (doc_support) { tmpComment = Lexer.consume_doc_comment (); @@ -5590,8 +5622,8 @@ void case_277() current_local_parameters = ParametersCompiled.EmptyReadOnlyParameters; } -void case_278() -#line 2306 "cs-parser.jay" +void case_279() +#line 2312 "cs-parser.jay" { var lt = (Tokenizer.LocatedToken) yyVals[-3+yyTop]; if (lt.Value != current_container.MemberName.Name){ @@ -5613,8 +5645,8 @@ void case_278() current_local_parameters = null; } -void case_279() -#line 2334 "cs-parser.jay" +void case_280() +#line 2338 "cs-parser.jay" { current_event_field = new EventField (current_type, (FullNamedExpression) yyVals[-1+yyTop], (Modifiers) yyVals[-3+yyTop], (MemberName) yyVals[0+yyTop], (Attributes) yyVals[-4+yyTop]); current_type.AddMember (current_event_field); @@ -5627,8 +5659,8 @@ void case_279() yyVal = current_event_field; } -void case_280() -#line 2348 "cs-parser.jay" +void case_281() +#line 2352 "cs-parser.jay" { if (doc_support) { current_event_field.DocComment = Lexer.consume_doc_comment (); @@ -5639,8 +5671,8 @@ void case_280() current_event_field = null; } -void case_281() -#line 2361 "cs-parser.jay" +void case_282() +#line 2365 "cs-parser.jay" { current_event = new EventProperty (current_type, (FullNamedExpression) yyVals[-2+yyTop], (Modifiers) yyVals[-4+yyTop], (MemberName) yyVals[-1+yyTop], (Attributes) yyVals[-5+yyTop]); current_type.AddMember (current_event); @@ -5649,8 +5681,8 @@ void case_281() lexer.EventParsing = true; } -void case_282() -#line 2369 "cs-parser.jay" +void case_283() +#line 2373 "cs-parser.jay" { if (current_container.Kind == MemberKind.Interface) report.Error (69, GetLocation (yyVals[-2+yyTop]), "Event in interface cannot have add or remove accessors"); @@ -5658,8 +5690,8 @@ void case_282() lexer.EventParsing = false; } -void case_283() -#line 2376 "cs-parser.jay" +void case_284() +#line 2380 "cs-parser.jay" { if (doc_support) { current_event.DocComment = Lexer.consume_doc_comment (); @@ -5671,23 +5703,23 @@ void case_283() current_local_parameters = null; } -void case_286() -#line 2395 "cs-parser.jay" +void case_287() +#line 2399 "cs-parser.jay" { --lexer.parsing_block; current_event_field.Initializer = (Expression) yyVals[0+yyTop]; } -void case_291() -#line 2419 "cs-parser.jay" +void case_292() +#line 2423 "cs-parser.jay" { var lt = (Tokenizer.LocatedToken) yyVals[0+yyTop]; yyVal = new FieldDeclarator (new SimpleMemberName (lt.Value, lt.Location), null); lbag.AddLocation (yyVal, GetLocation (yyVals[-1+yyTop])); } -void case_293() -#line 2429 "cs-parser.jay" +void case_294() +#line 2433 "cs-parser.jay" { --lexer.parsing_block; var lt = (Tokenizer.LocatedToken) yyVals[-3+yyTop]; @@ -5695,8 +5727,8 @@ void case_293() lbag.AddLocation (yyVal, GetLocation (yyVals[-4+yyTop]), GetLocation (yyVals[-2+yyTop])); } -void case_294() -#line 2438 "cs-parser.jay" +void case_295() +#line 2442 "cs-parser.jay" { if (current_container.Kind == MemberKind.Interface) { report.Error (68, lexer.Location, "`{0}': event in interface cannot have an initializer", @@ -5709,29 +5741,29 @@ void case_294() } } -void case_298() -#line 2459 "cs-parser.jay" +void case_299() +#line 2463 "cs-parser.jay" { report.Error (65, lexer.Location, "`{0}': event property must have both add and remove accessors", current_event.GetSignatureForError ()); } -void case_299() -#line 2464 "cs-parser.jay" +void case_300() +#line 2468 "cs-parser.jay" { report.Error (65, lexer.Location, "`{0}': event property must have both add and remove accessors", current_event.GetSignatureForError ()); } -void case_300() -#line 2469 "cs-parser.jay" +void case_301() +#line 2473 "cs-parser.jay" { report.Error (1055, GetLocation (yyVals[0+yyTop]), "An add or remove accessor expected"); yyVal = null; } -void case_301() -#line 2477 "cs-parser.jay" +void case_302() +#line 2481 "cs-parser.jay" { if (yyVals[-1+yyTop] != ModifierNone) { report.Error (1609, GetLocation (yyVals[-1+yyTop]), "Modifiers cannot be placed on event accessor declarations"); @@ -5744,8 +5776,8 @@ void case_301() lexer.EventParsing = false; } -void case_302() -#line 2489 "cs-parser.jay" +void case_303() +#line 2493 "cs-parser.jay" { lexer.EventParsing = true; @@ -5759,8 +5791,8 @@ void case_302() current_local_parameters = null; } -void case_303() -#line 2505 "cs-parser.jay" +void case_304() +#line 2509 "cs-parser.jay" { if (yyVals[-1+yyTop] != ModifierNone) { report.Error (1609, GetLocation (yyVals[-1+yyTop]), "Modifiers cannot be placed on event accessor declarations"); @@ -5773,8 +5805,8 @@ void case_303() lexer.EventParsing = false; } -void case_304() -#line 2517 "cs-parser.jay" +void case_305() +#line 2521 "cs-parser.jay" { lexer.EventParsing = true; @@ -5788,32 +5820,30 @@ void case_304() current_local_parameters = null; } -void case_305() -#line 2533 "cs-parser.jay" +void case_306() +#line 2537 "cs-parser.jay" { report.Error (73, lexer.Location, "An add or remove accessor must have a body"); yyVal = null; } -void case_307() -#line 2541 "cs-parser.jay" +void case_308() +#line 2546 "cs-parser.jay" { -#if FULL_AST current_type.UnattachedAttributes = (Attributes) yyVals[-1+yyTop]; -#endif report.Error (1519, GetLocation (yyVals[-1+yyTop]), "An attribute is missing member declaration"); lexer.putback ('}'); } -void case_308() -#line 2556 "cs-parser.jay" +void case_309() +#line 2559 "cs-parser.jay" { if (doc_support) enumTypeComment = Lexer.consume_doc_comment (); } -void case_309() -#line 2561 "cs-parser.jay" +void case_310() +#line 2564 "cs-parser.jay" { if (doc_support) Lexer.doc_state = XmlCommentState.Allowed; @@ -5823,7 +5853,7 @@ void case_309() report.Error (1675, name.Location, "Enums cannot have type parameters"); } - push_current_container (new Enum (current_container, (TypeExpression) yyVals[-2+yyTop], (Modifiers) yyVals[-5+yyTop], name, (Attributes) yyVals[-6+yyTop]), null); + push_current_container (new Enum (current_container, (FullNamedExpression) yyVals[-2+yyTop], (Modifiers) yyVals[-5+yyTop], name, (Attributes) yyVals[-6+yyTop]), null); if (yyVals[-2+yyTop] != null) { lbag.AddMember (current_container, GetModifierLocations (), GetLocation (yyVals[-4+yyTop]), savedLocation, GetLocation (yyVals[0+yyTop])); } else { @@ -5831,16 +5861,16 @@ void case_309() } } -void case_310() -#line 2578 "cs-parser.jay" +void case_311() +#line 2581 "cs-parser.jay" { /* here will be evaluated after CLOSE_BLACE is consumed.*/ if (doc_support) Lexer.doc_state = XmlCommentState.Allowed; } -void case_311() -#line 2584 "cs-parser.jay" +void case_312() +#line 2587 "cs-parser.jay" { lbag.AppendToMember (current_container, GetLocation (yyVals[-1+yyTop])); if (yyVals[0+yyTop] != null) { @@ -5857,35 +5887,29 @@ void case_311() yyVal = pop_current_class (); } -void case_313() -#line 2604 "cs-parser.jay" +void case_314() +#line 2607 "cs-parser.jay" { - var te = yyVals[0+yyTop] as TypeExpression; - if (te == null || !EnumSpec.IsValidUnderlyingType (te.Type)) { - Enum.Error_1008 (GetLocation (yyVals[0+yyTop]), report); - yyVal = null; - } else { - savedLocation = GetLocation (yyVals[-1+yyTop]); - yyVal = yyVals[0+yyTop]; - } + savedLocation = GetLocation (yyVals[-1+yyTop]); + yyVal = yyVals[0+yyTop]; } -void case_314() -#line 2615 "cs-parser.jay" +void case_315() +#line 2612 "cs-parser.jay" { Error_TypeExpected (GetLocation (yyVals[-1+yyTop])); yyVal = null; } -void case_319() -#line 2633 "cs-parser.jay" +void case_320() +#line 2630 "cs-parser.jay" { lbag.AppendToMember (current_container, GetLocation (yyVals[-1+yyTop])); yyVal = yyVals[0+yyTop]; } -void case_320() -#line 2641 "cs-parser.jay" +void case_321() +#line 2638 "cs-parser.jay" { var lt = (Tokenizer.LocatedToken) yyVals[0+yyTop]; var em = new EnumMember ((Enum) current_type, new MemberName (lt.Value, lt.Location), (Attributes) yyVals[-1+yyTop]); @@ -5899,8 +5923,8 @@ void case_320() yyVal = em; } -void case_321() -#line 2654 "cs-parser.jay" +void case_322() +#line 2651 "cs-parser.jay" { ++lexer.parsing_block; if (doc_support) { @@ -5909,8 +5933,8 @@ void case_321() } } -void case_322() -#line 2662 "cs-parser.jay" +void case_323() +#line 2659 "cs-parser.jay" { --lexer.parsing_block; @@ -5925,8 +5949,8 @@ void case_322() yyVal = em; } -void case_324() -#line 2687 "cs-parser.jay" +void case_325() +#line 2684 "cs-parser.jay" { valid_param_mod = 0; @@ -5942,8 +5966,8 @@ void case_324() lexer.ConstraintsParsing = true; } -void case_326() -#line 2706 "cs-parser.jay" +void case_327() +#line 2703 "cs-parser.jay" { if (doc_support) { current_delegate.DocComment = Lexer.consume_doc_comment (); @@ -5959,8 +5983,8 @@ void case_326() current_delegate = null; } -void case_328() -#line 2725 "cs-parser.jay" +void case_329() +#line 2722 "cs-parser.jay" { if (lang_version < LanguageVersion.ISO_2) FeatureIsNotAvailable (GetLocation (yyVals[0+yyTop]), "nullable types"); @@ -5968,8 +5992,8 @@ void case_328() yyVal = ComposedTypeSpecifier.CreateNullable (GetLocation (yyVals[0+yyTop])); } -void case_330() -#line 2736 "cs-parser.jay" +void case_331() +#line 2733 "cs-parser.jay" { var lt1 = (Tokenizer.LocatedToken) yyVals[-2+yyTop]; var lt2 = (Tokenizer.LocatedToken) yyVals[-1+yyTop]; @@ -5978,23 +6002,23 @@ void case_330() lbag.AddLocation (yyVal, GetLocation (yyVals[-1+yyTop])); } -void case_332() -#line 2748 "cs-parser.jay" +void case_333() +#line 2745 "cs-parser.jay" { var lt = (Tokenizer.LocatedToken) yyVals[-1+yyTop]; yyVal = new MemberAccess ((Expression) yyVals[-3+yyTop], lt.Value, (TypeArguments) yyVals[0+yyTop], lt.Location); lbag.AddLocation (yyVal, GetLocation (yyVals[-2+yyTop])); } -void case_333() -#line 2757 "cs-parser.jay" +void case_334() +#line 2754 "cs-parser.jay" { var lt = (Tokenizer.LocatedToken) yyVals[-1+yyTop]; yyVal = new SimpleName (lt.Value, (TypeArguments)yyVals[0+yyTop], lt.Location); } -void case_335() -#line 2769 "cs-parser.jay" +void case_336() +#line 2766 "cs-parser.jay" { if (lang_version < LanguageVersion.ISO_2) FeatureIsNotAvailable (GetLocation (yyVals[-2+yyTop]), "generics"); @@ -6006,15 +6030,15 @@ void case_335() yyVal = yyVals[-1+yyTop];; } -void case_336() -#line 2780 "cs-parser.jay" +void case_337() +#line 2777 "cs-parser.jay" { Error_TypeExpected (lexer.Location); yyVal = new TypeArguments (); } -void case_337() -#line 2788 "cs-parser.jay" +void case_338() +#line 2785 "cs-parser.jay" { TypeArguments type_args = new TypeArguments (); type_args.Add ((FullNamedExpression) yyVals[0+yyTop]); @@ -6022,8 +6046,8 @@ void case_337() locationListStack.Push (new List ()); } -void case_338() -#line 2795 "cs-parser.jay" +void case_339() +#line 2792 "cs-parser.jay" { TypeArguments type_args = (TypeArguments) yyVals[-2+yyTop]; type_args.Add ((FullNamedExpression) yyVals[0+yyTop]); @@ -6031,16 +6055,16 @@ void case_338() locationListStack.Peek ().Add (GetLocation (yyVals[-1+yyTop])); } -void case_340() -#line 2812 "cs-parser.jay" +void case_341() +#line 2809 "cs-parser.jay" { lexer.parsing_generic_declaration = false; var lt = (Tokenizer.LocatedToken) yyVals[-2+yyTop]; yyVal = new MemberName (lt.Value, (TypeParameters)yyVals[0+yyTop], lt.Location); } -void case_341() -#line 2821 "cs-parser.jay" +void case_342() +#line 2818 "cs-parser.jay" { MemberName mn = (MemberName)yyVals[0+yyTop]; if (mn.TypeParameters != null) @@ -6048,38 +6072,38 @@ void case_341() mn.GetSignatureForError ())); } -void case_343() -#line 2832 "cs-parser.jay" +void case_344() +#line 2829 "cs-parser.jay" { lexer.parsing_generic_declaration = false; var lt = (Tokenizer.LocatedToken) yyVals[-1+yyTop]; yyVal = new MemberName (lt.Value, (TypeParameters) yyVals[0+yyTop], (ATypeNameExpression) yyVals[-2+yyTop], lt.Location); } -void case_344() -#line 2841 "cs-parser.jay" +void case_345() +#line 2838 "cs-parser.jay" { lexer.parsing_generic_declaration = false; yyVal = new MemberName (TypeDefinition.DefaultIndexerName, GetLocation (yyVals[0+yyTop])); } -void case_345() -#line 2846 "cs-parser.jay" +void case_346() +#line 2843 "cs-parser.jay" { lexer.parsing_generic_declaration = false; yyVal = new MemberName (TypeDefinition.DefaultIndexerName, null, (ATypeNameExpression) yyVals[-1+yyTop], GetLocation (yyVals[0+yyTop])); } -void case_346() -#line 2854 "cs-parser.jay" +void case_347() +#line 2851 "cs-parser.jay" { var lt = (Tokenizer.LocatedToken) yyVals[-2+yyTop]; yyVal = new SimpleName (lt.Value, (TypeArguments) yyVals[-1+yyTop], lt.Location); lbag.AddLocation (yyVal, GetLocation (yyVals[0+yyTop])); } -void case_347() -#line 2860 "cs-parser.jay" +void case_348() +#line 2857 "cs-parser.jay" { var lt1 = (Tokenizer.LocatedToken) yyVals[-3+yyTop]; var lt2 = (Tokenizer.LocatedToken) yyVals[-2+yyTop]; @@ -6088,16 +6112,16 @@ void case_347() lbag.AddLocation (yyVal, GetLocation (yyVals[0+yyTop])); } -void case_348() -#line 2868 "cs-parser.jay" +void case_349() +#line 2865 "cs-parser.jay" { var lt = (Tokenizer.LocatedToken) yyVals[-2+yyTop]; yyVal = new MemberAccess ((ATypeNameExpression) yyVals[-3+yyTop], lt.Value, (TypeArguments) yyVals[-1+yyTop], lt.Location); lbag.AddLocation (yyVal, GetLocation (yyVals[0+yyTop])); } -void case_350() -#line 2878 "cs-parser.jay" +void case_351() +#line 2875 "cs-parser.jay" { if (lang_version < LanguageVersion.ISO_2) FeatureIsNotAvailable (GetLocation (yyVals[-2+yyTop]), "generics"); @@ -6109,8 +6133,8 @@ void case_350() lbag.AddLocation (yyVals[-1+yyTop], list); } -void case_351() -#line 2892 "cs-parser.jay" +void case_352() +#line 2889 "cs-parser.jay" { var tparams = new TypeParameters (); tparams.Add ((TypeParameter)yyVals[0+yyTop]); @@ -6118,8 +6142,8 @@ void case_351() locationListStack.Push (new List ()); } -void case_352() -#line 2899 "cs-parser.jay" +void case_353() +#line 2896 "cs-parser.jay" { var tparams = (TypeParameters) yyVals[-2+yyTop]; tparams.Add ((TypeParameter)yyVals[0+yyTop]); @@ -6127,15 +6151,15 @@ void case_352() locationListStack.Peek ().Add (GetLocation (yyVals[-1+yyTop])); } -void case_353() -#line 2909 "cs-parser.jay" +void case_354() +#line 2906 "cs-parser.jay" { var lt = (Tokenizer.LocatedToken)yyVals[0+yyTop]; yyVal = new TypeParameter (new MemberName (lt.Value, lt.Location), (Attributes)yyVals[-2+yyTop], (Variance) yyVals[-1+yyTop]); } -void case_354() -#line 2914 "cs-parser.jay" +void case_355() +#line 2911 "cs-parser.jay" { if (GetTokenName (yyToken) == "type") report.Error (81, GetLocation (yyVals[0+yyTop]), "Type parameter declaration must be an identifier not a type"); @@ -6145,29 +6169,29 @@ void case_354() yyVal = new TypeParameter (MemberName.Null, null, Variance.None); } -void case_359() -#line 2948 "cs-parser.jay" +void case_360() +#line 2945 "cs-parser.jay" { Expression.Error_VoidInvalidInTheContext (GetLocation (yyVals[0+yyTop]), report); yyVal = new TypeExpression (compiler.BuiltinTypes.Void, GetLocation (yyVals[0+yyTop])); } -void case_361() -#line 2957 "cs-parser.jay" +void case_362() +#line 2954 "cs-parser.jay" { Expression.Error_VoidInvalidInTheContext (GetLocation (yyVals[0+yyTop]), report); yyVal = new TypeExpression (compiler.BuiltinTypes.Void, GetLocation (yyVals[0+yyTop])); } -void case_363() -#line 2966 "cs-parser.jay" +void case_364() +#line 2963 "cs-parser.jay" { report.Error (1536, GetLocation (yyVals[0+yyTop]), "Invalid parameter type `void'"); yyVal = new TypeExpression (compiler.BuiltinTypes.Void, GetLocation (yyVals[0+yyTop])); } -void case_366() -#line 2982 "cs-parser.jay" +void case_367() +#line 2979 "cs-parser.jay" { if (yyVals[0+yyTop] != null) { yyVal = new ComposedCast ((ATypeNameExpression) yyVals[-1+yyTop], (ComposedTypeSpecifier) yyVals[0+yyTop]); @@ -6180,23 +6204,23 @@ void case_366() } } -void case_368() -#line 2998 "cs-parser.jay" +void case_369() +#line 2995 "cs-parser.jay" { if (yyVals[0+yyTop] != null) yyVal = new ComposedCast ((FullNamedExpression) yyVals[-1+yyTop], (ComposedTypeSpecifier) yyVals[0+yyTop]); } -void case_371() -#line 3014 "cs-parser.jay" +void case_372() +#line 3011 "cs-parser.jay" { var types = new List (2); types.Add ((FullNamedExpression) yyVals[0+yyTop]); yyVal = types; } -void case_372() -#line 3020 "cs-parser.jay" +void case_373() +#line 3017 "cs-parser.jay" { var types = (List) yyVals[-2+yyTop]; types.Add ((FullNamedExpression) yyVals[0+yyTop]); @@ -6204,8 +6228,8 @@ void case_372() yyVal = types; } -void case_373() -#line 3030 "cs-parser.jay" +void case_374() +#line 3027 "cs-parser.jay" { if (yyVals[0+yyTop] is ComposedCast) { report.Error (1521, GetLocation (yyVals[0+yyTop]), "Invalid base type `{0}'", ((ComposedCast)yyVals[0+yyTop]).GetSignatureForError ()); @@ -6213,29 +6237,29 @@ void case_373() yyVal = yyVals[0+yyTop]; } -void case_410() -#line 3094 "cs-parser.jay" +void case_411() +#line 3091 "cs-parser.jay" { var lt = (Tokenizer.LocatedToken) yyVals[-1+yyTop]; yyVal = new SimpleName (lt.Value, (TypeArguments)yyVals[0+yyTop], lt.Location); } -void case_411() -#line 3098 "cs-parser.jay" +void case_412() +#line 3095 "cs-parser.jay" { var lt = (Tokenizer.LocatedToken) yyVals[-1+yyTop]; yyVal = new CompletionSimpleName (MemberName.MakeName (lt.Value, null), lt.Location); } -void case_422() -#line 3139 "cs-parser.jay" +void case_423() +#line 3136 "cs-parser.jay" { yyVal = new ParenthesizedExpression ((Expression) yyVals[-1+yyTop]); lbag.AddLocation (yyVal, GetLocation (yyVals[-2+yyTop]), GetLocation (yyVals[0+yyTop])); } -void case_424() -#line 3151 "cs-parser.jay" +void case_425() +#line 3148 "cs-parser.jay" { var lt = (Tokenizer.LocatedToken) yyVals[-1+yyTop]; yyVal = new MemberAccess ((Expression) yyVals[-3+yyTop], lt.Value, (TypeArguments) yyVals[0+yyTop], lt.Location) { @@ -6243,8 +6267,8 @@ void case_424() }; } -void case_425() -#line 3158 "cs-parser.jay" +void case_426() +#line 3155 "cs-parser.jay" { var lt = (Tokenizer.LocatedToken) yyVals[-1+yyTop]; yyVal = new MemberAccess ((Expression) yyVals[-3+yyTop], lt.Value, (TypeArguments) yyVals[0+yyTop], lt.Location) { @@ -6252,8 +6276,8 @@ void case_425() }; } -void case_426() -#line 3165 "cs-parser.jay" +void case_427() +#line 3162 "cs-parser.jay" { var lt = (Tokenizer.LocatedToken) yyVals[-1+yyTop]; yyVal = new MemberAccess (new BaseThis (GetLocation (yyVals[-3+yyTop])), lt.Value, (TypeArguments) yyVals[0+yyTop], lt.Location) { @@ -6261,8 +6285,8 @@ void case_426() }; } -void case_427() -#line 3172 "cs-parser.jay" +void case_428() +#line 3169 "cs-parser.jay" { var lt1 = (Tokenizer.LocatedToken) yyVals[-2+yyTop]; var lt2 = (Tokenizer.LocatedToken) yyVals[-1+yyTop]; @@ -6271,29 +6295,29 @@ void case_427() lbag.AddLocation (yyVal, GetLocation (yyVals[-1+yyTop])); } -void case_429() -#line 3182 "cs-parser.jay" +void case_430() +#line 3179 "cs-parser.jay" { var lt = (Tokenizer.LocatedToken) yyVals[-1+yyTop]; yyVal = new CompletionMemberAccess ((Expression) yyVals[-3+yyTop], lt.Value, lt.Location); } -void case_431() -#line 3190 "cs-parser.jay" +void case_432() +#line 3187 "cs-parser.jay" { var lt = (Tokenizer.LocatedToken) yyVals[-1+yyTop]; yyVal = new CompletionMemberAccess ((Expression) yyVals[-3+yyTop], lt.Value, lt.Location); } -void case_432() -#line 3198 "cs-parser.jay" +void case_433() +#line 3195 "cs-parser.jay" { yyVal = new Invocation ((Expression) yyVals[-3+yyTop], (Arguments) yyVals[-1+yyTop]); lbag.AddLocation (yyVal, GetLocation (yyVals[-2+yyTop]), GetLocation (yyVals[0+yyTop])); } -void case_435() -#line 3211 "cs-parser.jay" +void case_436() +#line 3208 "cs-parser.jay" { if (yyVals[-1+yyTop] == null) { yyVal = CollectionOrObjectInitializers.Empty; @@ -6304,23 +6328,23 @@ void case_435() } } -void case_436() -#line 3221 "cs-parser.jay" +void case_437() +#line 3218 "cs-parser.jay" { yyVal = new CollectionOrObjectInitializers ((List) yyVals[-2+yyTop], GetLocation (yyVals[-3+yyTop])); lbag.AddLocation (yyVal, GetLocation (yyVals[-3+yyTop]), GetLocation (yyVals[-1+yyTop]), GetLocation (yyVals[0+yyTop])); } -void case_439() -#line 3237 "cs-parser.jay" +void case_440() +#line 3234 "cs-parser.jay" { var a = new List (); a.Add ((Expression) yyVals[0+yyTop]); yyVal = a; } -void case_440() -#line 3243 "cs-parser.jay" +void case_441() +#line 3240 "cs-parser.jay" { var a = (List)yyVals[-2+yyTop]; a.Add ((Expression) yyVals[0+yyTop]); @@ -6328,23 +6352,23 @@ void case_440() yyVal = a; } -void case_441() -#line 3249 "cs-parser.jay" +void case_442() +#line 3246 "cs-parser.jay" { Error_SyntaxError (yyToken); yyVal = yyVals[-1+yyTop]; } -void case_442() -#line 3257 "cs-parser.jay" +void case_443() +#line 3254 "cs-parser.jay" { var lt = (Tokenizer.LocatedToken) yyVals[-2+yyTop]; yyVal = new ElementInitializer (lt.Value, (Expression)yyVals[0+yyTop], lt.Location); lbag.AddLocation (yyVal, GetLocation (yyVals[-1+yyTop])); } -void case_444() -#line 3266 "cs-parser.jay" +void case_445() +#line 3263 "cs-parser.jay" { CompletionSimpleName csn = yyVals[-1+yyTop] as CompletionSimpleName; if (csn == null) @@ -6353,8 +6377,8 @@ void case_444() yyVal = new CompletionElementInitializer (csn.Prefix, csn.Location); } -void case_445() -#line 3274 "cs-parser.jay" +void case_446() +#line 3271 "cs-parser.jay" { if (yyVals[-1+yyTop] == null) yyVal = null; @@ -6364,23 +6388,23 @@ void case_445() } } -void case_446() -#line 3283 "cs-parser.jay" +void case_447() +#line 3280 "cs-parser.jay" { report.Error (1920, GetLocation (yyVals[-1+yyTop]), "An element initializer cannot be empty"); yyVal = null; } -void case_451() -#line 3301 "cs-parser.jay" +void case_452() +#line 3298 "cs-parser.jay" { Arguments list = new Arguments (4); list.Add ((Argument) yyVals[0+yyTop]); yyVal = list; } -void case_452() -#line 3307 "cs-parser.jay" +void case_453() +#line 3304 "cs-parser.jay" { Arguments list = (Arguments) yyVals[-2+yyTop]; if (list [list.Count - 1] is NamedArgument) @@ -6391,8 +6415,8 @@ void case_452() yyVal = list; } -void case_453() -#line 3317 "cs-parser.jay" +void case_454() +#line 3314 "cs-parser.jay" { Arguments list = (Arguments) yyVals[-2+yyTop]; NamedArgument a = (NamedArgument) yyVals[0+yyTop]; @@ -6408,65 +6432,79 @@ void case_453() yyVal = list; } -void case_454() -#line 3332 "cs-parser.jay" +void case_455() +#line 3329 "cs-parser.jay" { - report.Error (839, GetLocation (yyVals[0+yyTop]), "An argument is missing"); - yyVal = yyVals[-1+yyTop]; + Error_SyntaxError (yyToken); + yyVal = yyVals[-2+yyTop]; } -void case_455() -#line 3337 "cs-parser.jay" +void case_456() +#line 3334 "cs-parser.jay" { report.Error (839, GetLocation (yyVals[-1+yyTop]), "An argument is missing"); yyVal = null; } -void case_460() -#line 3358 "cs-parser.jay" +void case_461() +#line 3355 "cs-parser.jay" { yyVal = new Argument ((Expression) yyVals[0+yyTop], Argument.AType.Ref); lbag.AddLocation (yyVal, GetLocation (yyVals[-1+yyTop])); } -void case_461() -#line 3363 "cs-parser.jay" +void case_462() +#line 3360 "cs-parser.jay" { yyVal = new Argument ((Expression) yyVals[0+yyTop], Argument.AType.Out); lbag.AddLocation (yyVal, GetLocation (yyVals[-1+yyTop])); } -void case_462() -#line 3368 "cs-parser.jay" +void case_463() +#line 3365 "cs-parser.jay" { yyVal = new Argument (new Arglist ((Arguments) yyVals[-1+yyTop], GetLocation (yyVals[-3+yyTop]))); lbag.AddLocation (yyVal, GetLocation (yyVals[-2+yyTop]), GetLocation (yyVals[0+yyTop])); } -void case_463() -#line 3373 "cs-parser.jay" +void case_464() +#line 3370 "cs-parser.jay" { yyVal = new Argument (new Arglist (GetLocation (yyVals[-2+yyTop]))); lbag.AddLocation (yyVal, GetLocation (yyVals[-1+yyTop]), GetLocation (yyVals[0+yyTop])); } -void case_465() -#line 3385 "cs-parser.jay" +void case_466() +#line 3382 "cs-parser.jay" { yyVal = new ElementAccess ((Expression) yyVals[-3+yyTop], (Arguments) yyVals[-1+yyTop], GetLocation (yyVals[-2+yyTop])); lbag.AddLocation (yyVal, GetLocation (yyVals[0+yyTop])); } +void case_467() +#line 3387 "cs-parser.jay" +{ + Error_SyntaxError (yyToken); + yyVal = new ElementAccess ((Expression) yyVals[-3+yyTop], (Arguments) yyVals[-1+yyTop], GetLocation (yyVals[-2+yyTop])); + } + void case_468() -#line 3401 "cs-parser.jay" +#line 3392 "cs-parser.jay" +{ + Error_SyntaxError (yyToken); + yyVal = new ElementAccess ((Expression) yyVals[-2+yyTop], null, GetLocation (yyVals[-1+yyTop])); + } + +void case_469() +#line 3400 "cs-parser.jay" { var list = new List (4); list.Add ((Expression) yyVals[0+yyTop]); yyVal = list; } -void case_469() -#line 3407 "cs-parser.jay" +void case_470() +#line 3406 "cs-parser.jay" { var list = (List) yyVals[-2+yyTop]; list.Add ((Expression) yyVals[0+yyTop]); @@ -6474,23 +6512,23 @@ void case_469() yyVal = list; } -void case_470() -#line 3413 "cs-parser.jay" +void case_471() +#line 3412 "cs-parser.jay" { Error_SyntaxError (yyToken); yyVal = yyVals[-1+yyTop]; } -void case_471() -#line 3421 "cs-parser.jay" +void case_472() +#line 3420 "cs-parser.jay" { Arguments args = new Arguments (4); args.Add ((Argument) yyVals[0+yyTop]); yyVal = args; } -void case_472() -#line 3427 "cs-parser.jay" +void case_473() +#line 3426 "cs-parser.jay" { Arguments args = (Arguments) yyVals[-2+yyTop]; if (args [args.Count - 1] is NamedArgument && !(yyVals[0+yyTop] is NamedArgument)) @@ -6501,22 +6539,22 @@ void case_472() yyVal = args; } -void case_476() -#line 3455 "cs-parser.jay" +void case_477() +#line 3454 "cs-parser.jay" { yyVal = new ElementAccess (new BaseThis (GetLocation (yyVals[-3+yyTop])), (Arguments) yyVals[-1+yyTop], GetLocation (yyVals[-2+yyTop])); lbag.AddLocation (yyVal, GetLocation (yyVals[0+yyTop])); } -void case_477() -#line 3460 "cs-parser.jay" +void case_478() +#line 3459 "cs-parser.jay" { Error_SyntaxError (yyToken); yyVal = new ElementAccess (null, null, GetLocation (yyVals[-1+yyTop])); } -void case_480() -#line 3482 "cs-parser.jay" +void case_481() +#line 3481 "cs-parser.jay" { if (yyVals[0+yyTop] != null) { if (lang_version <= LanguageVersion.ISO_2) @@ -6530,8 +6568,8 @@ void case_480() lbag.AddLocation (yyVal, GetLocation (yyVals[-3+yyTop]), GetLocation (yyVals[-1+yyTop])); } -void case_481() -#line 3495 "cs-parser.jay" +void case_482() +#line 3494 "cs-parser.jay" { if (lang_version <= LanguageVersion.ISO_2) FeatureIsNotAvailable (GetLocation (yyVals[-2+yyTop]), "collection initializers"); @@ -6539,8 +6577,8 @@ void case_481() yyVal = new NewInitialize ((FullNamedExpression) yyVals[-1+yyTop], null, (CollectionOrObjectInitializers) yyVals[0+yyTop], GetLocation (yyVals[-2+yyTop])); } -void case_482() -#line 3507 "cs-parser.jay" +void case_483() +#line 3506 "cs-parser.jay" { yyVal = new ArrayCreation ((FullNamedExpression) yyVals[-5+yyTop], (List) yyVals[-3+yyTop], new ComposedTypeSpecifier (((List) yyVals[-3+yyTop]).Count, GetLocation (yyVals[-4+yyTop])) { @@ -6549,8 +6587,8 @@ void case_482() lbag.AddLocation (yyVal, GetLocation (yyVals[-4+yyTop]), GetLocation (yyVals[-2+yyTop])); } -void case_483() -#line 3515 "cs-parser.jay" +void case_484() +#line 3514 "cs-parser.jay" { if (yyVals[0+yyTop] == null) report.Error (1586, GetLocation (yyVals[-3+yyTop]), "Array creation must have array size or array initializer"); @@ -6558,8 +6596,8 @@ void case_483() yyVal = new ArrayCreation ((FullNamedExpression) yyVals[-2+yyTop], (ComposedTypeSpecifier) yyVals[-1+yyTop], (ArrayInitializer) yyVals[0+yyTop], GetLocation (yyVals[-3+yyTop])); } -void case_484() -#line 3522 "cs-parser.jay" +void case_485() +#line 3521 "cs-parser.jay" { if (lang_version <= LanguageVersion.ISO_2) FeatureIsNotAvailable (GetLocation (yyVals[-2+yyTop]), "implicitly typed arrays"); @@ -6567,28 +6605,29 @@ void case_484() yyVal = new ImplicitlyTypedArrayCreation ((ComposedTypeSpecifier) yyVals[-1+yyTop], (ArrayInitializer) yyVals[0+yyTop], GetLocation (yyVals[-2+yyTop])); } -void case_485() -#line 3529 "cs-parser.jay" +void case_486() +#line 3528 "cs-parser.jay" { report.Error (178, GetLocation (yyVals[-1+yyTop]), "Invalid rank specifier, expecting `,' or `]'"); yyVal = new ArrayCreation ((FullNamedExpression) yyVals[-5+yyTop], null, GetLocation (yyVals[-6+yyTop])); } -void case_486() -#line 3534 "cs-parser.jay" +void case_487() +#line 3533 "cs-parser.jay" { - Error_SyntaxError (1526, yyToken, "Unexpected symbol"); - yyVal = new ArrayCreation ((FullNamedExpression) yyVals[-1+yyTop], null, GetLocation (yyVals[-2+yyTop])); + Error_SyntaxError (yyToken); + /* It can be any of new expression, create the most common one*/ + yyVal = new New ((FullNamedExpression) yyVals[-1+yyTop], null, GetLocation (yyVals[-2+yyTop])); } -void case_488() +void case_489() #line 3545 "cs-parser.jay" { --lexer.parsing_type; yyVal = yyVals[0+yyTop]; } -void case_489() +void case_490() #line 3553 "cs-parser.jay" { if (lang_version <= LanguageVersion.ISO_2) @@ -6600,7 +6639,7 @@ void case_489() lbag.AddLocation (yyVal, GetLocation (yyVals[-2+yyTop]), GetLocation (yyVals[0+yyTop])); } -void case_494() +void case_495() #line 3576 "cs-parser.jay" { var a = new List (4); @@ -6608,7 +6647,7 @@ void case_494() yyVal = a; } -void case_495() +void case_496() #line 3582 "cs-parser.jay" { var a = (List) yyVals[-2+yyTop]; @@ -6618,7 +6657,7 @@ void case_495() yyVal = a; } -void case_496() +void case_497() #line 3593 "cs-parser.jay" { var lt = (Tokenizer.LocatedToken)yyVals[-2+yyTop]; @@ -6626,7 +6665,7 @@ void case_496() lbag.AddLocation (yyVal, GetLocation (yyVals[-1+yyTop])); } -void case_497() +void case_498() #line 3599 "cs-parser.jay" { var lt = (Tokenizer.LocatedToken)yyVals[0+yyTop]; @@ -6634,14 +6673,14 @@ void case_497() lt.Value, lt.Location); } -void case_498() +void case_499() #line 3605 "cs-parser.jay" { MemberAccess ma = (MemberAccess) yyVals[0+yyTop]; yyVal = new AnonymousTypeParameter (ma, ma.Name, ma.Location); } -void case_499() +void case_500() #line 3610 "cs-parser.jay" { report.Error (746, lexer.Location, @@ -6649,28 +6688,28 @@ void case_499() yyVal = null; } -void case_503() +void case_504() #line 3625 "cs-parser.jay" { ((ComposedTypeSpecifier) yyVals[-1+yyTop]).Next = (ComposedTypeSpecifier) yyVals[0+yyTop]; yyVal = yyVals[-1+yyTop]; } -void case_504() +void case_505() #line 3633 "cs-parser.jay" { yyVal = ComposedTypeSpecifier.CreateArrayDimension (1, GetLocation (yyVals[-1+yyTop])); lbag.AddLocation (yyVal, GetLocation (yyVals[0+yyTop])); } -void case_505() +void case_506() #line 3638 "cs-parser.jay" { yyVal = ComposedTypeSpecifier.CreateArrayDimension ((int)yyVals[-1+yyTop], GetLocation (yyVals[-2+yyTop])); lbag.AddLocation (yyVal, GetLocation (yyVals[0+yyTop])); } -void case_510() +void case_511() #line 3668 "cs-parser.jay" { var ai = new ArrayInitializer (0, GetLocation (yyVals[-1+yyTop])); @@ -6679,7 +6718,7 @@ void case_510() yyVal = ai; } -void case_511() +void case_512() #line 3675 "cs-parser.jay" { var ai = new ArrayInitializer ((List) yyVals[-2+yyTop], GetLocation (yyVals[-3+yyTop])); @@ -6692,7 +6731,7 @@ void case_511() yyVal = ai; } -void case_512() +void case_513() #line 3689 "cs-parser.jay" { var list = new List (4); @@ -6700,7 +6739,7 @@ void case_512() yyVal = list; } -void case_513() +void case_514() #line 3695 "cs-parser.jay" { var list = (List) yyVals[-2+yyTop]; @@ -6709,7 +6748,7 @@ void case_513() yyVal = list; } -void case_515() +void case_516() #line 3709 "cs-parser.jay" { lexer.TypeOfParsing = false; @@ -6717,14 +6756,14 @@ void case_515() lbag.AddLocation (yyVal, GetLocation (yyVals[-2+yyTop]), GetLocation (yyVals[0+yyTop])); } -void case_518() +void case_519() #line 3720 "cs-parser.jay" { Error_TypeExpected (lexer.Location); yyVal = null; } -void case_519() +void case_520() #line 3728 "cs-parser.jay" { var lt = (Tokenizer.LocatedToken) yyVals[-1+yyTop]; @@ -6732,7 +6771,7 @@ void case_519() yyVal = new SimpleName (lt.Value, (int) yyVals[0+yyTop], lt.Location); } -void case_520() +void case_521() #line 3734 "cs-parser.jay" { var lt1 = (Tokenizer.LocatedToken) yyVals[-2+yyTop]; @@ -6742,7 +6781,7 @@ void case_520() lbag.AddLocation (yyVal, GetLocation (yyVals[-1+yyTop])); } -void case_521() +void case_522() #line 3742 "cs-parser.jay" { var lt = (Tokenizer.LocatedToken) yyVals[0+yyTop]; @@ -6752,7 +6791,7 @@ void case_521() }; } -void case_522() +void case_523() #line 3750 "cs-parser.jay" { var lt = (Tokenizer.LocatedToken) yyVals[-1+yyTop]; @@ -6762,7 +6801,7 @@ void case_522() }; } -void case_523() +void case_524() #line 3758 "cs-parser.jay" { var tne = (ATypeNameExpression) yyVals[-3+yyTop]; @@ -6775,7 +6814,7 @@ void case_523() }; } -void case_524() +void case_525() #line 3772 "cs-parser.jay" { if (lang_version < LanguageVersion.ISO_2) @@ -6784,7 +6823,7 @@ void case_524() yyVal = yyVals[0+yyTop]; } -void case_525() +void case_526() #line 3782 "cs-parser.jay" { var lt = (Tokenizer.LocatedToken) yyVals[-1+yyTop]; @@ -6794,35 +6833,35 @@ void case_525() yyVal = lt; } -void case_526() +void case_527() #line 3793 "cs-parser.jay" { yyVal = new SizeOf ((Expression) yyVals[-1+yyTop], GetLocation (yyVals[-3+yyTop])); lbag.AddLocation (yyVal, GetLocation (yyVals[-2+yyTop]), GetLocation (yyVals[0+yyTop])); } -void case_527() +void case_528() #line 3801 "cs-parser.jay" { yyVal = new CheckedExpr ((Expression) yyVals[-1+yyTop], GetLocation (yyVals[-3+yyTop])); lbag.AddLocation (yyVal, GetLocation (yyVals[-2+yyTop]), GetLocation (yyVals[0+yyTop])); } -void case_528() +void case_529() #line 3809 "cs-parser.jay" { yyVal = new UnCheckedExpr ((Expression) yyVals[-1+yyTop], GetLocation (yyVals[-3+yyTop])); lbag.AddLocation (yyVal, GetLocation (yyVals[-2+yyTop]), GetLocation (yyVals[0+yyTop])); } -void case_529() +void case_530() #line 3817 "cs-parser.jay" { var lt = (Tokenizer.LocatedToken) yyVals[-1+yyTop]; yyVal = new MemberAccess (new Indirection ((Expression) yyVals[-3+yyTop], GetLocation (yyVals[-2+yyTop])), lt.Value, (TypeArguments) yyVals[0+yyTop], lt.Location); } -void case_531() +void case_532() #line 3829 "cs-parser.jay" { yyVal = end_anonymous ((ParametersBlock) yyVals[0+yyTop]); @@ -6833,7 +6872,7 @@ void case_531() } } -void case_533() +void case_534() #line 3842 "cs-parser.jay" { yyVal = end_anonymous ((ParametersBlock) yyVals[0+yyTop]); @@ -6845,7 +6884,7 @@ void case_533() } } -void case_537() +void case_538() #line 3867 "cs-parser.jay" { valid_param_mod = 0; @@ -6854,7 +6893,7 @@ void case_537() savedCloseLocation = GetLocation (yyVals[-2+yyTop]); } -void case_538() +void case_539() #line 3877 "cs-parser.jay" { if (lang_version < LanguageVersion.ISO_2) @@ -6864,19 +6903,27 @@ void case_538() lbag.AddLocation (yyVal, GetLocation (yyVals[-2+yyTop]), GetLocation (yyVals[0+yyTop])); } -void case_542() +void case_543() #line 3897 "cs-parser.jay" { yyVal = new Cast ((FullNamedExpression) yyVals[-2+yyTop], (Expression) yyVals[0+yyTop], GetLocation (yyVals[-3+yyTop])); lbag.AddLocation (yyVal, GetLocation (yyVals[-1+yyTop])); } -void case_543() +void case_544() #line 3902 "cs-parser.jay" { if (!async_block) { - report.Error (1992, GetLocation (yyVals[-1+yyTop]), - "The `await' operator can only be used when its containing method or lambda expression is marked with the `async' modifier"); + if (current_anonymous_method is LambdaExpression) { + report.Error (4034, GetLocation (yyVals[-1+yyTop]), + "The `await' operator can only be used when its containing lambda expression is marked with the `async' modifier"); + } else if (current_anonymous_method is AnonymousMethodExpression) { + report.Error (4035, GetLocation (yyVals[-1+yyTop]), + "The `await' operator can only be used when its containing anonymous method is marked with the `async' modifier"); + } else { + report.Error (4033, GetLocation (yyVals[-1+yyTop]), + "The `await' operator can only be used when its containing method is marked with the `async' modifier"); + } } else { current_block.Explicit.RegisterAsyncAwait (); } @@ -6884,134 +6931,134 @@ void case_543() yyVal = new Await ((Expression) yyVals[0+yyTop], GetLocation (yyVals[-1+yyTop])); } -void case_552() -#line 3949 "cs-parser.jay" +void case_553() +#line 3957 "cs-parser.jay" { yyVal = new Binary (Binary.Operator.Multiply, (Expression) yyVals[-2+yyTop], (Expression) yyVals[0+yyTop], GetLocation (yyVals[-1+yyTop])); } -void case_553() -#line 3954 "cs-parser.jay" +void case_554() +#line 3962 "cs-parser.jay" { yyVal = new Binary (Binary.Operator.Division, (Expression) yyVals[-2+yyTop], (Expression) yyVals[0+yyTop], GetLocation (yyVals[-1+yyTop])); } -void case_554() -#line 3959 "cs-parser.jay" +void case_555() +#line 3967 "cs-parser.jay" { yyVal = new Binary (Binary.Operator.Modulus, (Expression) yyVals[-2+yyTop], (Expression) yyVals[0+yyTop], GetLocation (yyVals[-1+yyTop])); } -void case_556() -#line 3968 "cs-parser.jay" +void case_557() +#line 3976 "cs-parser.jay" { yyVal = new Binary (Binary.Operator.Addition, (Expression) yyVals[-2+yyTop], (Expression) yyVals[0+yyTop], GetLocation (yyVals[-1+yyTop])); } -void case_558() -#line 3977 "cs-parser.jay" +void case_559() +#line 3985 "cs-parser.jay" { /* Shift/Reduce conflict*/ yyVal = new Binary (Binary.Operator.Subtraction, (Expression) yyVals[-2+yyTop], (Expression) yyVals[0+yyTop], GetLocation (yyVals[-1+yyTop])); } -void case_562() -#line 3994 "cs-parser.jay" +void case_563() +#line 4002 "cs-parser.jay" { yyVal = new Binary (Binary.Operator.LeftShift, (Expression) yyVals[-2+yyTop], (Expression) yyVals[0+yyTop], GetLocation (yyVals[-1+yyTop])); } -void case_563() -#line 3999 "cs-parser.jay" +void case_564() +#line 4007 "cs-parser.jay" { yyVal = new Binary (Binary.Operator.RightShift, (Expression) yyVals[-2+yyTop], (Expression) yyVals[0+yyTop], GetLocation (yyVals[-1+yyTop])); } -void case_565() -#line 4008 "cs-parser.jay" +void case_566() +#line 4016 "cs-parser.jay" { yyVal = new Binary (Binary.Operator.LessThan, (Expression) yyVals[-2+yyTop], (Expression) yyVals[0+yyTop], GetLocation (yyVals[-1+yyTop])); } -void case_566() -#line 4013 "cs-parser.jay" +void case_567() +#line 4021 "cs-parser.jay" { yyVal = new Binary (Binary.Operator.GreaterThan, (Expression) yyVals[-2+yyTop], (Expression) yyVals[0+yyTop], GetLocation (yyVals[-1+yyTop])); } -void case_567() -#line 4018 "cs-parser.jay" +void case_568() +#line 4026 "cs-parser.jay" { yyVal = new Binary (Binary.Operator.LessThanOrEqual, (Expression) yyVals[-2+yyTop], (Expression) yyVals[0+yyTop], GetLocation (yyVals[-1+yyTop])); } -void case_568() -#line 4023 "cs-parser.jay" +void case_569() +#line 4031 "cs-parser.jay" { yyVal = new Binary (Binary.Operator.GreaterThanOrEqual, (Expression) yyVals[-2+yyTop], (Expression) yyVals[0+yyTop], GetLocation (yyVals[-1+yyTop])); } -void case_570() -#line 4032 "cs-parser.jay" +void case_571() +#line 4040 "cs-parser.jay" { yyVal = new Binary (Binary.Operator.Equality, (Expression) yyVals[-2+yyTop], (Expression) yyVals[0+yyTop], GetLocation (yyVals[-1+yyTop])); } -void case_571() -#line 4037 "cs-parser.jay" +void case_572() +#line 4045 "cs-parser.jay" { yyVal = new Binary (Binary.Operator.Inequality, (Expression) yyVals[-2+yyTop], (Expression) yyVals[0+yyTop], GetLocation (yyVals[-1+yyTop])); } -void case_573() -#line 4046 "cs-parser.jay" +void case_574() +#line 4054 "cs-parser.jay" { yyVal = new Binary (Binary.Operator.BitwiseAnd, (Expression) yyVals[-2+yyTop], (Expression) yyVals[0+yyTop], GetLocation (yyVals[-1+yyTop])); } -void case_575() -#line 4055 "cs-parser.jay" +void case_576() +#line 4063 "cs-parser.jay" { yyVal = new Binary (Binary.Operator.ExclusiveOr, (Expression) yyVals[-2+yyTop], (Expression) yyVals[0+yyTop], GetLocation (yyVals[-1+yyTop])); } -void case_577() -#line 4064 "cs-parser.jay" +void case_578() +#line 4072 "cs-parser.jay" { yyVal = new Binary (Binary.Operator.BitwiseOr, (Expression) yyVals[-2+yyTop], (Expression) yyVals[0+yyTop], GetLocation (yyVals[-1+yyTop])); } -void case_579() -#line 4073 "cs-parser.jay" +void case_580() +#line 4081 "cs-parser.jay" { yyVal = new Binary (Binary.Operator.LogicalAnd, (Expression) yyVals[-2+yyTop], (Expression) yyVals[0+yyTop], GetLocation (yyVals[-1+yyTop])); } -void case_581() -#line 4082 "cs-parser.jay" +void case_582() +#line 4090 "cs-parser.jay" { yyVal = new Binary (Binary.Operator.LogicalOr, (Expression) yyVals[-2+yyTop], (Expression) yyVals[0+yyTop], GetLocation (yyVals[-1+yyTop])); } -void case_583() -#line 4091 "cs-parser.jay" +void case_584() +#line 4099 "cs-parser.jay" { if (lang_version < LanguageVersion.ISO_2) FeatureIsNotAvailable (GetLocation (yyVals[-1+yyTop]), "null coalescing operator"); @@ -7019,85 +7066,92 @@ void case_583() yyVal = new Nullable.NullCoalescingOperator ((Expression) yyVals[-2+yyTop], (Expression) yyVals[0+yyTop], GetLocation (yyVals[-1+yyTop])); } -void case_585() -#line 4102 "cs-parser.jay" +void case_586() +#line 4110 "cs-parser.jay" { yyVal = new Conditional (new BooleanExpression ((Expression) yyVals[-4+yyTop]), (Expression) yyVals[-2+yyTop], (Expression) yyVals[0+yyTop], GetLocation (yyVals[-3+yyTop])); lbag.AddLocation (yyVal, GetLocation (yyVals[-1+yyTop])); } void case_587() -#line 4114 "cs-parser.jay" +#line 4115 "cs-parser.jay" +{ + Error_SyntaxError (yyToken); + yyVal = new Conditional (new BooleanExpression ((Expression) yyVals[-3+yyTop]), (Expression) yyVals[-1+yyTop], null, GetLocation (yyVals[-2+yyTop])); + } + +void case_589() +#line 4127 "cs-parser.jay" { yyVal = new CompoundAssign ( Binary.Operator.Multiply, (Expression) yyVals[-2+yyTop], (Expression) yyVals[0+yyTop], GetLocation (yyVals[-1+yyTop])); } -void case_588() -#line 4119 "cs-parser.jay" +void case_590() +#line 4132 "cs-parser.jay" { yyVal = new CompoundAssign ( Binary.Operator.Division, (Expression) yyVals[-2+yyTop], (Expression) yyVals[0+yyTop], GetLocation (yyVals[-1+yyTop])); } -void case_589() -#line 4124 "cs-parser.jay" +void case_591() +#line 4137 "cs-parser.jay" { yyVal = new CompoundAssign ( Binary.Operator.Modulus, (Expression) yyVals[-2+yyTop], (Expression) yyVals[0+yyTop], GetLocation (yyVals[-1+yyTop])); } -void case_590() -#line 4129 "cs-parser.jay" +void case_592() +#line 4142 "cs-parser.jay" { yyVal = new CompoundAssign ( Binary.Operator.Addition, (Expression) yyVals[-2+yyTop], (Expression) yyVals[0+yyTop], GetLocation (yyVals[-1+yyTop])); } -void case_591() -#line 4134 "cs-parser.jay" +void case_593() +#line 4147 "cs-parser.jay" { yyVal = new CompoundAssign ( Binary.Operator.Subtraction, (Expression) yyVals[-2+yyTop], (Expression) yyVals[0+yyTop], GetLocation (yyVals[-1+yyTop])); } -void case_592() -#line 4139 "cs-parser.jay" +void case_594() +#line 4152 "cs-parser.jay" { yyVal = new CompoundAssign ( Binary.Operator.LeftShift, (Expression) yyVals[-2+yyTop], (Expression) yyVals[0+yyTop], GetLocation (yyVals[-1+yyTop])); } -void case_593() -#line 4144 "cs-parser.jay" +void case_595() +#line 4157 "cs-parser.jay" { yyVal = new CompoundAssign ( Binary.Operator.RightShift, (Expression) yyVals[-2+yyTop], (Expression) yyVals[0+yyTop], GetLocation (yyVals[-1+yyTop])); } -void case_594() -#line 4149 "cs-parser.jay" +void case_596() +#line 4162 "cs-parser.jay" { yyVal = new CompoundAssign ( Binary.Operator.BitwiseAnd, (Expression) yyVals[-2+yyTop], (Expression) yyVals[0+yyTop], GetLocation (yyVals[-1+yyTop])); } -void case_595() -#line 4154 "cs-parser.jay" +void case_597() +#line 4167 "cs-parser.jay" { yyVal = new CompoundAssign ( Binary.Operator.BitwiseOr, (Expression) yyVals[-2+yyTop], (Expression) yyVals[0+yyTop], GetLocation (yyVals[-1+yyTop])); } -void case_596() -#line 4159 "cs-parser.jay" +void case_598() +#line 4172 "cs-parser.jay" { yyVal = new CompoundAssign ( Binary.Operator.ExclusiveOr, (Expression) yyVals[-2+yyTop], (Expression) yyVals[0+yyTop], GetLocation (yyVals[-1+yyTop])); } -void case_597() -#line 4167 "cs-parser.jay" +void case_599() +#line 4180 "cs-parser.jay" { var pars = new List (4); pars.Add ((Parameter) yyVals[0+yyTop]); @@ -7105,8 +7159,8 @@ void case_597() yyVal = pars; } -void case_598() -#line 4174 "cs-parser.jay" +void case_600() +#line 4187 "cs-parser.jay" { var pars = (List) yyVals[-2+yyTop]; Parameter p = (Parameter)yyVals[0+yyTop]; @@ -7120,39 +7174,39 @@ void case_598() yyVal = pars; } -void case_599() -#line 4190 "cs-parser.jay" +void case_601() +#line 4203 "cs-parser.jay" { var lt = (Tokenizer.LocatedToken) yyVals[0+yyTop]; yyVal = new Parameter ((FullNamedExpression) yyVals[-1+yyTop], lt.Value, (Parameter.Modifier) yyVals[-2+yyTop], null, lt.Location); } -void case_600() -#line 4196 "cs-parser.jay" +void case_602() +#line 4209 "cs-parser.jay" { var lt = (Tokenizer.LocatedToken) yyVals[0+yyTop]; yyVal = new Parameter ((FullNamedExpression) yyVals[-1+yyTop], lt.Value, Parameter.Modifier.NONE, null, lt.Location); } -void case_601() -#line 4202 "cs-parser.jay" +void case_603() +#line 4215 "cs-parser.jay" { var lt = (Tokenizer.LocatedToken) yyVals[0+yyTop]; yyVal = new ImplicitLambdaParameter (lt.Value, lt.Location); } -void case_603() -#line 4210 "cs-parser.jay" +void case_605() +#line 4223 "cs-parser.jay" { var pars_list = (List) yyVals[0+yyTop]; yyVal = new ParametersCompiled (pars_list.ToArray ()); lbag.AddLocation (yyVal, parameterListCommas); } -void case_607() -#line 4227 "cs-parser.jay" +void case_609() +#line 4240 "cs-parser.jay" { Block b = end_block (Location.Null); b.IsCompilerGenerated = true; @@ -7160,94 +7214,94 @@ void case_607() yyVal = b; } -void case_609() -#line 4238 "cs-parser.jay" +void case_611() +#line 4251 "cs-parser.jay" { Error_SyntaxError (yyToken); yyVal = EmptyExpression.Null; } -void case_610() -#line 4246 "cs-parser.jay" +void case_612() +#line 4259 "cs-parser.jay" { var lt = (Tokenizer.LocatedToken) yyVals[-1+yyTop]; Parameter p = new ImplicitLambdaParameter (lt.Value, lt.Location); start_anonymous (true, new ParametersCompiled (p), false, lt.Location); } -void case_611() -#line 4252 "cs-parser.jay" +void case_613() +#line 4265 "cs-parser.jay" { yyVal = end_anonymous ((ParametersBlock) yyVals[0+yyTop]); lbag.AddLocation (yyVal, GetLocation (yyVals[-2+yyTop])); } -void case_612() -#line 4257 "cs-parser.jay" +void case_614() +#line 4270 "cs-parser.jay" { var lt = (Tokenizer.LocatedToken) yyVals[-1+yyTop]; Parameter p = new ImplicitLambdaParameter (lt.Value, lt.Location); start_anonymous (true, new ParametersCompiled (p), true, lt.Location); } -void case_613() -#line 4263 "cs-parser.jay" +void case_615() +#line 4276 "cs-parser.jay" { yyVal = end_anonymous ((ParametersBlock) yyVals[0+yyTop]); lbag.AddLocation (yyVal, GetLocation (yyVals[-4+yyTop]), GetLocation (yyVals[-2+yyTop])); } -void case_615() -#line 4272 "cs-parser.jay" +void case_617() +#line 4285 "cs-parser.jay" { valid_param_mod = 0; start_anonymous (true, (ParametersCompiled) yyVals[-2+yyTop], false, GetLocation (yyVals[-4+yyTop])); } -void case_616() -#line 4277 "cs-parser.jay" +void case_618() +#line 4290 "cs-parser.jay" { yyVal = end_anonymous ((ParametersBlock) yyVals[0+yyTop]); lbag.AddLocation (yyVal, GetLocation (yyVals[-6+yyTop]), GetLocation (yyVals[-3+yyTop]), GetLocation (yyVals[-2+yyTop])); } -void case_618() -#line 4286 "cs-parser.jay" +void case_620() +#line 4299 "cs-parser.jay" { valid_param_mod = 0; start_anonymous (true, (ParametersCompiled) yyVals[-2+yyTop], true, GetLocation (yyVals[-5+yyTop])); } -void case_619() -#line 4291 "cs-parser.jay" +void case_621() +#line 4304 "cs-parser.jay" { yyVal = end_anonymous ((ParametersBlock) yyVals[0+yyTop]); lbag.AddLocation (yyVal, GetLocation (yyVals[-7+yyTop]), GetLocation (yyVals[-6+yyTop]), GetLocation (yyVals[-3+yyTop]), GetLocation (yyVals[-2+yyTop])); } -void case_626() -#line 4314 "cs-parser.jay" +void case_628() +#line 4327 "cs-parser.jay" { yyVal = new RefValueExpr ((Expression) yyVals[-3+yyTop], (FullNamedExpression) yyVals[-1+yyTop], GetLocation (yyVals[-5+yyTop])); lbag.AddLocation (yyVal, GetLocation (yyVals[-4+yyTop]), GetLocation (yyVals[-2+yyTop]), GetLocation (yyVals[0+yyTop])); } -void case_627() -#line 4319 "cs-parser.jay" +void case_629() +#line 4332 "cs-parser.jay" { yyVal = new RefTypeExpr ((Expression) yyVals[-1+yyTop], GetLocation (yyVals[-3+yyTop])); lbag.AddLocation (yyVal, GetLocation (yyVals[-2+yyTop]), GetLocation (yyVals[0+yyTop])); } -void case_628() -#line 4324 "cs-parser.jay" +void case_630() +#line 4337 "cs-parser.jay" { yyVal = new MakeRefExpr ((Expression) yyVals[-1+yyTop], GetLocation (yyVals[-3+yyTop])); lbag.AddLocation (yyVal, GetLocation (yyVals[-2+yyTop]), GetLocation (yyVals[0+yyTop])); } -void case_632() -#line 4353 "cs-parser.jay" +void case_634() +#line 4366 "cs-parser.jay" { Class c = new Class (current_container, (MemberName) yyVals[0+yyTop], (Modifiers) yyVals[-4+yyTop], (Attributes) yyVals[-5+yyTop]); if (((c.ModFlags & Modifiers.STATIC) != 0) && lang_version == LanguageVersion.ISO_1) { @@ -7258,8 +7312,8 @@ void case_632() lbag.AddMember (current_container, GetModifierLocations (), GetLocation (yyVals[-2+yyTop])); } -void case_633() -#line 4364 "cs-parser.jay" +void case_635() +#line 4377 "cs-parser.jay" { lexer.ConstraintsParsing = false; @@ -7274,16 +7328,16 @@ void case_633() lexer.parsing_modifiers = true; } -void case_634() -#line 4378 "cs-parser.jay" +void case_636() +#line 4391 "cs-parser.jay" { --lexer.parsing_declaration; if (doc_support) Lexer.doc_state = XmlCommentState.Allowed; } -void case_635() -#line 4384 "cs-parser.jay" +void case_637() +#line 4397 "cs-parser.jay" { if (yyVals[0+yyTop] == null) { lbag.AppendToMember (current_container, GetLocation (yyVals[-4+yyTop]), GetLocation (yyVals[-2+yyTop])); @@ -7293,16 +7347,16 @@ void case_635() yyVal = pop_current_class (); } -void case_638() -#line 4403 "cs-parser.jay" +void case_640() +#line 4416 "cs-parser.jay" { mod_locations = null; yyVal = ModifierNone; lexer.parsing_modifiers = false; } -void case_641() -#line 4417 "cs-parser.jay" +void case_643() +#line 4430 "cs-parser.jay" { var m1 = (Modifiers) yyVals[-1+yyTop]; var m2 = (Modifiers) yyVals[0+yyTop]; @@ -7319,8 +7373,8 @@ void case_641() yyVal = m1 | m2; } -void case_642() -#line 4436 "cs-parser.jay" +void case_644() +#line 4449 "cs-parser.jay" { yyVal = Modifiers.NEW; StoreModifierLocation (yyVal, GetLocation (yyVals[0+yyTop])); @@ -7329,92 +7383,92 @@ void case_642() report.Error (1530, GetLocation (yyVals[0+yyTop]), "Keyword `new' is not allowed on namespace elements"); } -void case_643() -#line 4444 "cs-parser.jay" +void case_645() +#line 4457 "cs-parser.jay" { yyVal = Modifiers.PUBLIC; StoreModifierLocation (yyVal, GetLocation (yyVals[0+yyTop])); } -void case_644() -#line 4449 "cs-parser.jay" +void case_646() +#line 4462 "cs-parser.jay" { yyVal = Modifiers.PROTECTED; StoreModifierLocation (yyVal, GetLocation (yyVals[0+yyTop])); } -void case_645() -#line 4454 "cs-parser.jay" +void case_647() +#line 4467 "cs-parser.jay" { yyVal = Modifiers.INTERNAL; StoreModifierLocation (yyVal, GetLocation (yyVals[0+yyTop])); } -void case_646() -#line 4459 "cs-parser.jay" +void case_648() +#line 4472 "cs-parser.jay" { yyVal = Modifiers.PRIVATE; StoreModifierLocation (yyVal, GetLocation (yyVals[0+yyTop])); } -void case_647() -#line 4464 "cs-parser.jay" +void case_649() +#line 4477 "cs-parser.jay" { yyVal = Modifiers.ABSTRACT; StoreModifierLocation (yyVal, GetLocation (yyVals[0+yyTop])); } -void case_648() -#line 4469 "cs-parser.jay" +void case_650() +#line 4482 "cs-parser.jay" { yyVal = Modifiers.SEALED; StoreModifierLocation (yyVal, GetLocation (yyVals[0+yyTop])); } -void case_649() -#line 4474 "cs-parser.jay" +void case_651() +#line 4487 "cs-parser.jay" { yyVal = Modifiers.STATIC; StoreModifierLocation (yyVal, GetLocation (yyVals[0+yyTop])); } -void case_650() -#line 4479 "cs-parser.jay" +void case_652() +#line 4492 "cs-parser.jay" { yyVal = Modifiers.READONLY; StoreModifierLocation (yyVal, GetLocation (yyVals[0+yyTop])); } -void case_651() -#line 4484 "cs-parser.jay" +void case_653() +#line 4497 "cs-parser.jay" { yyVal = Modifiers.VIRTUAL; StoreModifierLocation (yyVal, GetLocation (yyVals[0+yyTop])); } -void case_652() -#line 4489 "cs-parser.jay" +void case_654() +#line 4502 "cs-parser.jay" { yyVal = Modifiers.OVERRIDE; StoreModifierLocation (yyVal, GetLocation (yyVals[0+yyTop])); } -void case_653() -#line 4494 "cs-parser.jay" +void case_655() +#line 4507 "cs-parser.jay" { yyVal = Modifiers.EXTERN; StoreModifierLocation (yyVal, GetLocation (yyVals[0+yyTop])); } -void case_654() -#line 4499 "cs-parser.jay" +void case_656() +#line 4512 "cs-parser.jay" { yyVal = Modifiers.VOLATILE; StoreModifierLocation (yyVal, GetLocation (yyVals[0+yyTop])); } -void case_655() -#line 4504 "cs-parser.jay" +void case_657() +#line 4517 "cs-parser.jay" { yyVal = Modifiers.UNSAFE; StoreModifierLocation (yyVal, GetLocation (yyVals[0+yyTop])); @@ -7422,38 +7476,38 @@ void case_655() Error_UnsafeCodeNotAllowed (GetLocation (yyVals[0+yyTop])); } -void case_656() -#line 4511 "cs-parser.jay" +void case_658() +#line 4524 "cs-parser.jay" { yyVal = Modifiers.ASYNC; StoreModifierLocation (yyVal, GetLocation (yyVals[0+yyTop])); } -void case_658() -#line 4520 "cs-parser.jay" +void case_660() +#line 4533 "cs-parser.jay" { current_type.AddBasesForPart ((List) yyVals[0+yyTop]); lbag.AppendToMember (current_type, GetLocation (yyVals[-1+yyTop])); } -void case_659() -#line 4525 "cs-parser.jay" +void case_661() +#line 4538 "cs-parser.jay" { Error_SyntaxError (yyToken); current_type.AddBasesForPart ((List) yyVals[-1+yyTop]); } -void case_662() -#line 4542 "cs-parser.jay" +void case_664() +#line 4555 "cs-parser.jay" { var constraints = new List (1); constraints.Add ((Constraints) yyVals[0+yyTop]); yyVal = constraints; } -void case_663() -#line 4548 "cs-parser.jay" +void case_665() +#line 4561 "cs-parser.jay" { var constraints = (List) yyVals[-1+yyTop]; Constraints new_constraint = (Constraints)yyVals[0+yyTop]; @@ -7470,16 +7524,16 @@ void case_663() yyVal = constraints; } -void case_664() -#line 4567 "cs-parser.jay" +void case_666() +#line 4580 "cs-parser.jay" { var lt = (Tokenizer.LocatedToken) yyVals[-2+yyTop]; yyVal = new Constraints (new SimpleMemberName (lt.Value, lt.Location), (List) yyVals[0+yyTop], GetLocation (yyVals[-3+yyTop])); lbag.AddLocation (yyVal, GetLocation (yyVals[-1+yyTop])); } -void case_665() -#line 4573 "cs-parser.jay" +void case_667() +#line 4586 "cs-parser.jay" { Error_SyntaxError (yyToken); @@ -7487,16 +7541,16 @@ void case_665() yyVal = new Constraints (new SimpleMemberName (lt.Value, lt.Location), null, GetLocation (yyVals[-2+yyTop])); } -void case_666() -#line 4583 "cs-parser.jay" +void case_668() +#line 4596 "cs-parser.jay" { var constraints = new List (1); constraints.Add ((FullNamedExpression) yyVals[0+yyTop]); yyVal = constraints; } -void case_667() -#line 4589 "cs-parser.jay" +void case_669() +#line 4602 "cs-parser.jay" { var constraints = (List) yyVals[-2+yyTop]; var prev = constraints [constraints.Count - 1] as SpecialContraintExpr; @@ -7521,8 +7575,8 @@ void case_667() yyVal = constraints; } -void case_668() -#line 4616 "cs-parser.jay" +void case_670() +#line 4629 "cs-parser.jay" { if (yyVals[0+yyTop] is ComposedCast) report.Error (706, GetLocation (yyVals[0+yyTop]), "Invalid constraint type `{0}'", ((ComposedCast)yyVals[0+yyTop]).GetSignatureForError ()); @@ -7530,15 +7584,15 @@ void case_668() yyVal = yyVals[0+yyTop]; } -void case_669() -#line 4623 "cs-parser.jay" +void case_671() +#line 4636 "cs-parser.jay" { yyVal = new SpecialContraintExpr (SpecialConstraint.Constructor, GetLocation (yyVals[-2+yyTop])); lbag.AddLocation (yyVal, GetLocation (yyVals[-1+yyTop]), GetLocation (yyVals[0+yyTop])); } -void case_673() -#line 4643 "cs-parser.jay" +void case_675() +#line 4656 "cs-parser.jay" { if (lang_version <= LanguageVersion.V_3) FeatureIsNotAvailable (lexer.Location, "generic type variance"); @@ -7546,65 +7600,65 @@ void case_673() yyVal = yyVals[0+yyTop]; } -void case_674() -#line 4653 "cs-parser.jay" +void case_676() +#line 4666 "cs-parser.jay" { yyVal = Variance.Covariant; savedLocation = GetLocation (yyVals[0+yyTop]); } -void case_675() -#line 4658 "cs-parser.jay" +void case_677() +#line 4671 "cs-parser.jay" { yyVal = Variance.Contravariant; savedLocation = GetLocation (yyVals[0+yyTop]); } -void case_676() -#line 4679 "cs-parser.jay" +void case_678() +#line 4692 "cs-parser.jay" { ++lexer.parsing_block; start_block (GetLocation (yyVals[0+yyTop])); } -void case_678() -#line 4691 "cs-parser.jay" +void case_680() +#line 4704 "cs-parser.jay" { --lexer.parsing_block; yyVal = end_block (GetLocation (yyVals[0+yyTop])); } -void case_679() -#line 4696 "cs-parser.jay" +void case_681() +#line 4709 "cs-parser.jay" { --lexer.parsing_block; yyVal = end_block (lexer.Location); } -void case_680() -#line 4705 "cs-parser.jay" +void case_682() +#line 4718 "cs-parser.jay" { ++lexer.parsing_block; current_block.StartLocation = GetLocation (yyVals[0+yyTop]); } -void case_681() -#line 4710 "cs-parser.jay" +void case_683() +#line 4723 "cs-parser.jay" { --lexer.parsing_block; yyVal = end_block (GetLocation (yyVals[0+yyTop])); } -void case_682() -#line 4714 "cs-parser.jay" +void case_684() +#line 4727 "cs-parser.jay" { report.Error (1525, GetLocation (yyVals[0+yyTop]), "Unexpected symbol '}', expected '{'"); lexer.putback ('}'); yyVal = end_block (GetLocation (yyVals[0+yyTop])); } -void case_690() -#line 4743 "cs-parser.jay" +void case_692() +#line 4756 "cs-parser.jay" { Error_SyntaxError (yyToken); var lt =(Tokenizer.LocatedToken) yyVals[-1+yyTop]; @@ -7613,43 +7667,43 @@ void case_690() yyVal = null; } -void case_691() -#line 4752 "cs-parser.jay" +void case_693() +#line 4765 "cs-parser.jay" { Error_SyntaxError (yyToken); yyVal = null; } -void case_724() -#line 4816 "cs-parser.jay" +void case_726() +#line 4829 "cs-parser.jay" { report.Error (1023, GetLocation (yyVals[0+yyTop]), "An embedded statement may not be a declaration or labeled statement"); yyVal = null; } -void case_725() -#line 4821 "cs-parser.jay" +void case_727() +#line 4834 "cs-parser.jay" { report.Error (1023, GetLocation (yyVals[0+yyTop]), "An embedded statement may not be a declaration or labeled statement"); yyVal = null; } -void case_726() -#line 4826 "cs-parser.jay" +void case_728() +#line 4839 "cs-parser.jay" { Error_SyntaxError (yyToken); yyVal = new EmptyStatement (GetLocation (yyVals[0+yyTop])); } -void case_727() -#line 4834 "cs-parser.jay" +void case_729() +#line 4847 "cs-parser.jay" { /* Uses lexer.Location because semicolon location is not kept in quick mode*/ yyVal = new EmptyStatement (lexer.Location); } -void case_728() -#line 4842 "cs-parser.jay" +void case_730() +#line 4855 "cs-parser.jay" { var lt = (Tokenizer.LocatedToken) yyVals[-1+yyTop]; LabeledStatement labeled = new LabeledStatement (lt.Value, current_block, lt.Location); @@ -7658,8 +7712,8 @@ void case_728() current_block.AddStatement (labeled); } -void case_731() -#line 4855 "cs-parser.jay" +void case_733() +#line 4868 "cs-parser.jay" { if (yyVals[-1+yyTop] is VarExpr) yyVals[-1+yyTop] = new SimpleName ("var", ((VarExpr) yyVals[-1+yyTop]).Location); @@ -7667,8 +7721,8 @@ void case_731() yyVal = new ComposedCast ((FullNamedExpression) yyVals[-1+yyTop], (ComposedTypeSpecifier) yyVals[0+yyTop]); } -void case_732() -#line 4871 "cs-parser.jay" +void case_734() +#line 4884 "cs-parser.jay" { /* Ok, the above "primary_expression" is there to get rid of*/ /* both reduce/reduce and shift/reduces in the grammar, it should*/ @@ -7699,8 +7753,8 @@ void case_732() } } -void case_733() -#line 4901 "cs-parser.jay" +void case_735() +#line 4914 "cs-parser.jay" { ATypeNameExpression expr = yyVals[-1+yyTop] as ATypeNameExpression; @@ -7712,8 +7766,8 @@ void case_733() } } -void case_734() -#line 4912 "cs-parser.jay" +void case_736() +#line 4925 "cs-parser.jay" { if (yyVals[0+yyTop] == null) yyVal = yyVals[-1+yyTop]; @@ -7721,22 +7775,22 @@ void case_734() yyVal = new ComposedCast ((FullNamedExpression) yyVals[-1+yyTop], (ComposedTypeSpecifier) yyVals[0+yyTop]); } -void case_737() -#line 4927 "cs-parser.jay" +void case_739() +#line 4940 "cs-parser.jay" { Expression.Error_VoidInvalidInTheContext (GetLocation (yyVals[0+yyTop]), report); yyVal = new TypeExpression (compiler.BuiltinTypes.Void, GetLocation (yyVals[0+yyTop])); } -void case_739() -#line 4936 "cs-parser.jay" +void case_741() +#line 4949 "cs-parser.jay" { ((ComposedTypeSpecifier) yyVals[-1+yyTop]).Next = (ComposedTypeSpecifier) yyVals[0+yyTop]; yyVal = yyVals[-1+yyTop]; } -void case_742() -#line 4952 "cs-parser.jay" +void case_744() +#line 4965 "cs-parser.jay" { if (async_block) { report.Error (4003, GetLocation (yyVals[0+yyTop]), "`await' cannot be used as an identifier within an async method or lambda expression"); @@ -7744,8 +7798,8 @@ void case_742() } } -void case_743() -#line 4962 "cs-parser.jay" +void case_745() +#line 4975 "cs-parser.jay" { var lt = (Tokenizer.LocatedToken) yyVals[0+yyTop]; var li = new LocalVariable (current_block, lt.Value, lt.Location); @@ -7753,16 +7807,16 @@ void case_743() current_variable = new BlockVariableDeclaration ((FullNamedExpression) yyVals[-1+yyTop], li); } -void case_744() -#line 4969 "cs-parser.jay" +void case_746() +#line 4982 "cs-parser.jay" { yyVal = current_variable; current_variable = null; lbag.AppendTo (yyVal, GetLocation (yyVals[0+yyTop])); } -void case_745() -#line 4975 "cs-parser.jay" +void case_747() +#line 4988 "cs-parser.jay" { var lt = (Tokenizer.LocatedToken) yyVals[0+yyTop]; var li = new LocalVariable (current_block, lt.Value, LocalVariable.Flags.Constant, lt.Location); @@ -7770,8 +7824,8 @@ void case_745() current_variable = new BlockConstantDeclaration ((FullNamedExpression) yyVals[-1+yyTop], li); } -void case_746() -#line 4982 "cs-parser.jay" +void case_748() +#line 4995 "cs-parser.jay" { if (current_variable.Initializer != null) { lbag.AddLocation (current_variable, GetLocation (yyVals[-6+yyTop]), savedLocation, GetLocation (yyVals[0+yyTop])); @@ -7782,8 +7836,8 @@ void case_746() current_variable = null; } -void case_748() -#line 4995 "cs-parser.jay" +void case_750() +#line 5008 "cs-parser.jay" { /* Redundant, but wont regress*/ report.Error (1525, lexer.Location, "Unexpected symbol }"); @@ -7791,15 +7845,15 @@ void case_748() yyVal = yyVals[0+yyTop]; } -void case_750() -#line 5006 "cs-parser.jay" +void case_752() +#line 5019 "cs-parser.jay" { current_variable.Initializer = (Expression) yyVals[0+yyTop]; lbag.AppendTo (current_variable, GetLocation (yyVals[-1+yyTop])); } -void case_751() -#line 5011 "cs-parser.jay" +void case_753() +#line 5024 "cs-parser.jay" { if (yyToken == Token.OPEN_BRACKET_EXPR) { report.Error (650, lexer.Location, @@ -7814,8 +7868,8 @@ void case_751() lbag.AppendTo (current_variable, GetLocation (yyVals[-1+yyTop])); } -void case_752() -#line 5025 "cs-parser.jay" +void case_754() +#line 5038 "cs-parser.jay" { if (yyToken == Token.OPEN_BRACKET_EXPR) { report.Error (650, lexer.Location, @@ -7825,8 +7879,8 @@ void case_752() } } -void case_756() -#line 5043 "cs-parser.jay" +void case_758() +#line 5056 "cs-parser.jay" { foreach (var d in current_variable.Declarators) { if (d.Initializer == null) @@ -7834,8 +7888,8 @@ void case_756() } } -void case_759() -#line 5058 "cs-parser.jay" +void case_761() +#line 5071 "cs-parser.jay" { var lt = (Tokenizer.LocatedToken) yyVals[0+yyTop]; var li = new LocalVariable (current_variable.Variable, lt.Value, lt.Location); @@ -7845,8 +7899,8 @@ void case_759() lbag.AddLocation (d, GetLocation (yyVals[-1+yyTop])); } -void case_760() -#line 5067 "cs-parser.jay" +void case_762() +#line 5080 "cs-parser.jay" { var lt = (Tokenizer.LocatedToken) yyVals[-2+yyTop]; var li = new LocalVariable (current_variable.Variable, lt.Value, lt.Location); @@ -7856,15 +7910,15 @@ void case_760() lbag.AddLocation (d, GetLocation (yyVals[-3+yyTop]), GetLocation (yyVals[-1+yyTop])); } -void case_762() -#line 5083 "cs-parser.jay" +void case_764() +#line 5096 "cs-parser.jay" { savedLocation = GetLocation (yyVals[-1+yyTop]); current_variable.Initializer = (Expression) yyVals[0+yyTop]; } -void case_767() -#line 5101 "cs-parser.jay" +void case_769() +#line 5114 "cs-parser.jay" { var lt = (Tokenizer.LocatedToken) yyVals[-2+yyTop]; var li = new LocalVariable (current_block, lt.Value, LocalVariable.Flags.Constant, lt.Location); @@ -7874,37 +7928,37 @@ void case_767() lbag.AddLocation (d, GetLocation (yyVals[-3+yyTop]), GetLocation (yyVals[-1+yyTop])); } -void case_769() -#line 5114 "cs-parser.jay" +void case_771() +#line 5127 "cs-parser.jay" { yyVal = new StackAlloc ((Expression) yyVals[-3+yyTop], (Expression) yyVals[-1+yyTop], GetLocation (yyVals[-4+yyTop])); lbag.AddLocation (yyVal, GetLocation (yyVals[-2+yyTop]), GetLocation (yyVals[0+yyTop])); } -void case_770() -#line 5119 "cs-parser.jay" +void case_772() +#line 5132 "cs-parser.jay" { report.Error (1575, GetLocation (yyVals[-1+yyTop]), "A stackalloc expression requires [] after type"); yyVal = new StackAlloc ((Expression) yyVals[0+yyTop], null, GetLocation (yyVals[-1+yyTop])); } -void case_771() -#line 5127 "cs-parser.jay" +void case_773() +#line 5140 "cs-parser.jay" { yyVal = yyVals[-1+yyTop]; lbag.AddStatement (yyVal, GetLocation (yyVals[0+yyTop])); } -void case_773() -#line 5133 "cs-parser.jay" +void case_775() +#line 5146 "cs-parser.jay" { yyVal = yyVals[-1+yyTop]; report.Error (1002, GetLocation (yyVals[0+yyTop]), "; expected"); lexer.putback ('}'); } -void case_776() -#line 5151 "cs-parser.jay" +void case_778() +#line 5164 "cs-parser.jay" { ExpressionStatement s = yyVals[0+yyTop] as ExpressionStatement; if (s == null) { @@ -7915,8 +7969,8 @@ void case_776() } } -void case_777() -#line 5164 "cs-parser.jay" +void case_779() +#line 5177 "cs-parser.jay" { Expression expr = (Expression) yyVals[0+yyTop]; ExpressionStatement s; @@ -7925,15 +7979,15 @@ void case_777() yyVal = new StatementExpression (s); } -void case_778() -#line 5172 "cs-parser.jay" +void case_780() +#line 5185 "cs-parser.jay" { Error_SyntaxError (yyToken); yyVal = new EmptyStatement (GetLocation (yyVals[0+yyTop])); } -void case_781() -#line 5186 "cs-parser.jay" +void case_783() +#line 5199 "cs-parser.jay" { if (yyVals[0+yyTop] is EmptyStatement) Warning_EmptyStatement (GetLocation (yyVals[0+yyTop])); @@ -7942,8 +7996,8 @@ void case_781() lbag.AddStatement (yyVal, GetLocation (yyVals[-3+yyTop]), GetLocation (yyVals[-1+yyTop])); } -void case_782() -#line 5195 "cs-parser.jay" +void case_784() +#line 5208 "cs-parser.jay" { yyVal = new If ((BooleanExpression) yyVals[-4+yyTop], (Statement) yyVals[-2+yyTop], (Statement) yyVals[0+yyTop], GetLocation (yyVals[-6+yyTop])); lbag.AddStatement (yyVal, GetLocation (yyVals[-5+yyTop]), GetLocation (yyVals[-3+yyTop]), GetLocation (yyVals[-1+yyTop])); @@ -7954,8 +8008,8 @@ void case_782() Warning_EmptyStatement (GetLocation (yyVals[0+yyTop])); } -void case_783() -#line 5205 "cs-parser.jay" +void case_785() +#line 5218 "cs-parser.jay" { Error_SyntaxError (yyToken); @@ -7963,16 +8017,16 @@ void case_783() lbag.AddStatement (yyVal, GetLocation (yyVals[-2+yyTop])); } -void case_785() -#line 5219 "cs-parser.jay" +void case_787() +#line 5232 "cs-parser.jay" { yyVal = new Switch ((Expression) yyVals[-5+yyTop], (ExplicitBlock) current_block.Explicit, (List) yyVals[-1+yyTop], GetLocation (yyVals[-7+yyTop])); end_block (GetLocation (yyVals[0+yyTop])); lbag.AddStatement (yyVal, GetLocation (yyVals[-6+yyTop]), GetLocation (yyVals[-4+yyTop]), GetLocation (yyVals[-3+yyTop]), GetLocation (yyVals[0+yyTop])); } -void case_786() -#line 5225 "cs-parser.jay" +void case_788() +#line 5238 "cs-parser.jay" { Error_SyntaxError (yyToken); @@ -7980,15 +8034,15 @@ void case_786() lbag.AddStatement (yyVal, GetLocation (yyVals[-2+yyTop])); } -void case_787() -#line 5235 "cs-parser.jay" +void case_789() +#line 5248 "cs-parser.jay" { report.Warning (1522, 1, current_block.StartLocation, "Empty switch block"); yyVal = new List (); } -void case_789() -#line 5244 "cs-parser.jay" +void case_791() +#line 5257 "cs-parser.jay" { var sections = new List (4); @@ -7996,8 +8050,8 @@ void case_789() yyVal = sections; } -void case_790() -#line 5251 "cs-parser.jay" +void case_792() +#line 5264 "cs-parser.jay" { var sections = (List) yyVals[-1+yyTop]; @@ -8005,15 +8059,15 @@ void case_790() yyVal = sections; } -void case_791() -#line 5258 "cs-parser.jay" +void case_793() +#line 5271 "cs-parser.jay" { Error_SyntaxError (yyToken); yyVal = new List (); } -void case_794() -#line 5277 "cs-parser.jay" +void case_796() +#line 5290 "cs-parser.jay" { var labels = new List (2); @@ -8021,8 +8075,8 @@ void case_794() yyVal = labels; } -void case_795() -#line 5284 "cs-parser.jay" +void case_797() +#line 5297 "cs-parser.jay" { var labels = (List) (yyVals[-1+yyTop]); labels.Add ((SwitchLabel) yyVals[0+yyTop]); @@ -8030,15 +8084,22 @@ void case_795() yyVal = labels; } -void case_796() -#line 5294 "cs-parser.jay" +void case_798() +#line 5307 "cs-parser.jay" { yyVal = new SwitchLabel ((Expression) yyVals[-1+yyTop], GetLocation (yyVals[-2+yyTop])); lbag.AddLocation (yyVal, GetLocation (yyVals[0+yyTop])); } -void case_802() -#line 5313 "cs-parser.jay" +void case_799() +#line 5312 "cs-parser.jay" +{ + Error_SyntaxError (yyToken); + yyVal = new SwitchLabel ((Expression) yyVals[-1+yyTop], GetLocation (yyVals[-2+yyTop])); + } + +void case_805() +#line 5331 "cs-parser.jay" { if (yyVals[0+yyTop] is EmptyStatement && lexer.peek_token () == Token.OPEN_BRACE) Warning_EmptyStatement (GetLocation (yyVals[0+yyTop])); @@ -8047,8 +8108,8 @@ void case_802() lbag.AddStatement (yyVal, GetLocation (yyVals[-3+yyTop]), GetLocation (yyVals[-1+yyTop])); } -void case_803() -#line 5321 "cs-parser.jay" +void case_806() +#line 5339 "cs-parser.jay" { Error_SyntaxError (yyToken); @@ -8056,22 +8117,22 @@ void case_803() lbag.AddStatement (yyVal, GetLocation (yyVals[-2+yyTop])); } -void case_804() -#line 5331 "cs-parser.jay" +void case_807() +#line 5349 "cs-parser.jay" { yyVal = new Do ((Statement) yyVals[-5+yyTop], (BooleanExpression) yyVals[-2+yyTop], GetLocation (yyVals[-6+yyTop])); lbag.AddStatement (yyVal, GetLocation (yyVals[-4+yyTop]), GetLocation (yyVals[-3+yyTop]), GetLocation (yyVals[-1+yyTop]), GetLocation (yyVals[0+yyTop])); } -void case_805() -#line 5336 "cs-parser.jay" +void case_808() +#line 5354 "cs-parser.jay" { Error_SyntaxError (yyToken); yyVal = new Do ((Statement) yyVals[-1+yyTop], null, GetLocation (yyVals[-2+yyTop])); } -void case_806() -#line 5341 "cs-parser.jay" +void case_809() +#line 5359 "cs-parser.jay" { Error_SyntaxError (yyToken); @@ -8079,8 +8140,8 @@ void case_806() lbag.AddStatement (yyVal, GetLocation (yyVals[-3+yyTop]), GetLocation (yyVals[-2+yyTop])); } -void case_807() -#line 5351 "cs-parser.jay" +void case_810() +#line 5369 "cs-parser.jay" { start_block (GetLocation (yyVals[0+yyTop])); current_block.IsCompilerGenerated = true; @@ -8090,8 +8151,8 @@ void case_807() yyVal = f; } -void case_809() -#line 5368 "cs-parser.jay" +void case_812() +#line 5386 "cs-parser.jay" { For f = (For) yyVals[-2+yyTop]; f.Initializer = (Statement) yyVals[-1+yyTop]; @@ -8099,8 +8160,8 @@ void case_809() yyVal = f; } -void case_811() -#line 5378 "cs-parser.jay" +void case_814() +#line 5396 "cs-parser.jay" { report.Error (1525, GetLocation (yyVals[0+yyTop]), "Unexpected symbol ')', expected ';'"); For f = (For) yyVals[-2+yyTop]; @@ -8109,8 +8170,8 @@ void case_811() yyVal = end_block (GetLocation (yyVals[0+yyTop])); } -void case_812() -#line 5389 "cs-parser.jay" +void case_815() +#line 5407 "cs-parser.jay" { For f = (For) yyVals[-2+yyTop]; f.Condition = (BooleanExpression) yyVals[-1+yyTop]; @@ -8118,8 +8179,8 @@ void case_812() yyVal = f; } -void case_814() -#line 5399 "cs-parser.jay" +void case_817() +#line 5417 "cs-parser.jay" { report.Error (1525, GetLocation (yyVals[0+yyTop]), "Unexpected symbol ')', expected ';'"); For f = (For) yyVals[-2+yyTop]; @@ -8128,8 +8189,8 @@ void case_814() yyVal = end_block (GetLocation (yyVals[0+yyTop])); } -void case_815() -#line 5411 "cs-parser.jay" +void case_818() +#line 5429 "cs-parser.jay" { For f = (For) yyVals[-3+yyTop]; f.Iterator = (Statement) yyVals[-2+yyTop]; @@ -8143,15 +8204,15 @@ void case_815() yyVal = end_block (GetLocation (yyVals[-1+yyTop])); } -void case_816() -#line 5424 "cs-parser.jay" +void case_819() +#line 5442 "cs-parser.jay" { Error_SyntaxError (yyToken); yyVal = end_block (current_block.StartLocation); } -void case_819() -#line 5437 "cs-parser.jay" +void case_822() +#line 5455 "cs-parser.jay" { var lt = (Tokenizer.LocatedToken) yyVals[0+yyTop]; var li = new LocalVariable (current_block, lt.Value, lt.Location); @@ -8159,15 +8220,15 @@ void case_819() current_variable = new BlockVariableDeclaration ((FullNamedExpression) yyVals[-1+yyTop], li); } -void case_820() -#line 5444 "cs-parser.jay" +void case_823() +#line 5462 "cs-parser.jay" { yyVal = current_variable; current_variable = null; } -void case_828() -#line 5468 "cs-parser.jay" +void case_831() +#line 5486 "cs-parser.jay" { var sl = yyVals[-2+yyTop] as StatementList; if (sl == null) { @@ -8176,31 +8237,32 @@ void case_828() } else { sl.Add ((Statement) yyVals[0+yyTop]); lbag.AppendTo (sl, GetLocation (yyVals[-1+yyTop])); + } yyVal = sl; } -void case_829() -#line 5484 "cs-parser.jay" +void case_832() +#line 5503 "cs-parser.jay" { report.Error (230, GetLocation (yyVals[-3+yyTop]), "Type and identifier are both required in a foreach statement"); start_block (GetLocation (yyVals[-2+yyTop])); current_block.IsCompilerGenerated = true; - Foreach f = new Foreach ((Expression) yyVals[-1+yyTop], null, null, null, GetLocation (yyVals[-3+yyTop])); + Foreach f = new Foreach ((Expression) yyVals[-1+yyTop], null, null, null, null, GetLocation (yyVals[-3+yyTop])); current_block.AddStatement (f); lbag.AddStatement (f, GetLocation (yyVals[-2+yyTop])); yyVal = end_block (GetLocation (yyVals[0+yyTop])); } -void case_830() -#line 5497 "cs-parser.jay" +void case_833() +#line 5516 "cs-parser.jay" { Error_SyntaxError (yyToken); - + start_block (GetLocation (yyVals[-3+yyTop])); current_block.IsCompilerGenerated = true; @@ -8208,15 +8270,15 @@ void case_830() var li = new LocalVariable (current_block, lt.Value, LocalVariable.Flags.ForeachVariable | LocalVariable.Flags.Used, lt.Location); current_block.AddLocalName (li); - Foreach f = new Foreach ((Expression) yyVals[-2+yyTop], li, null, null, GetLocation (yyVals[-4+yyTop])); + Foreach f = new Foreach ((Expression) yyVals[-2+yyTop], li, null, null, null, GetLocation (yyVals[-4+yyTop])); current_block.AddStatement (f); lbag.AddStatement (f, GetLocation (yyVals[-3+yyTop])); yyVal = end_block (GetLocation (yyVals[0+yyTop])); } -void case_831() -#line 5514 "cs-parser.jay" +void case_834() +#line 5533 "cs-parser.jay" { start_block (GetLocation (yyVals[-5+yyTop])); current_block.IsCompilerGenerated = true; @@ -8226,96 +8288,117 @@ void case_831() yyVal = li; } -void case_832() -#line 5523 "cs-parser.jay" +void case_835() +#line 5542 "cs-parser.jay" { if (yyVals[0+yyTop] is EmptyStatement && lexer.peek_token () == Token.OPEN_BRACE) Warning_EmptyStatement (GetLocation (yyVals[0+yyTop])); - - Foreach f = new Foreach ((Expression) yyVals[-6+yyTop], (LocalVariable) yyVals[-1+yyTop], (Expression) yyVals[-3+yyTop], (Statement) yyVals[0+yyTop], GetLocation (yyVals[-8+yyTop])); - current_block.AddStatement (f); + Foreach f = new Foreach ((Expression) yyVals[-6+yyTop], (LocalVariable) yyVals[-1+yyTop], (Expression) yyVals[-3+yyTop], (Statement) yyVals[0+yyTop], current_block, GetLocation (yyVals[-8+yyTop])); lbag.AddStatement (f, GetLocation (yyVals[-7+yyTop]), GetLocation (yyVals[-4+yyTop]), GetLocation (yyVals[-2+yyTop])); - yyVal = end_block (GetLocation (yyVals[-2+yyTop])); + end_block (GetLocation (yyVals[-2+yyTop])); + + yyVal = f; } -void case_833() -#line 5534 "cs-parser.jay" +void case_836() +#line 5553 "cs-parser.jay" { start_block (GetLocation (yyVals[-3+yyTop])); current_block.IsCompilerGenerated = true; var lt = yyVals[-1+yyTop] as Tokenizer.LocatedToken; var li = lt != null ? new LocalVariable (current_block, lt.Value, LocalVariable.Flags.ForeachVariable | LocalVariable.Flags.Used, lt.Location) : null; - Foreach f = new Foreach ((Expression) yyVals[-2+yyTop], li, null, null, GetLocation (yyVals[-4+yyTop])); + Foreach f = new Foreach ((Expression) yyVals[-2+yyTop], li, null, null, null, GetLocation (yyVals[-4+yyTop])); current_block.AddStatement (f); lbag.AddStatement (f, GetLocation (yyVals[-3+yyTop])); yyVal = end_block (GetLocation (yyVals[0+yyTop])); } -void case_834() -#line 5547 "cs-parser.jay" +void case_837() +#line 5566 "cs-parser.jay" { - Foreach f = new Foreach ((Expression) yyVals[-1+yyTop], null, null, null, GetLocation (yyVals[-3+yyTop])); + Foreach f = new Foreach ((Expression) yyVals[-1+yyTop], null, null, null, null, GetLocation (yyVals[-3+yyTop])); current_block.AddStatement (f); lbag.AddStatement (f, GetLocation (yyVals[-2+yyTop])); yyVal = f; } -void case_841() -#line 5567 "cs-parser.jay" +void case_844() +#line 5586 "cs-parser.jay" { yyVal = new Break (GetLocation (yyVals[-1+yyTop])); lbag.AddStatement (yyVal, GetLocation (yyVals[0+yyTop])); } -void case_842() -#line 5575 "cs-parser.jay" +void case_845() +#line 5594 "cs-parser.jay" { yyVal = new Continue (GetLocation (yyVals[-1+yyTop])); lbag.AddStatement (yyVal, GetLocation (yyVals[0+yyTop])); } -void case_843() -#line 5583 "cs-parser.jay" +void case_846() +#line 5599 "cs-parser.jay" +{ + Error_SyntaxError (yyToken); + yyVal = new Continue (GetLocation (yyVals[-1+yyTop])); + } + +void case_847() +#line 5607 "cs-parser.jay" { var lt = (Tokenizer.LocatedToken) yyVals[-1+yyTop]; yyVal = new Goto (lt.Value, GetLocation (yyVals[-2+yyTop])); lbag.AddStatement (yyVal, GetLocation (yyVals[-1+yyTop]), GetLocation (yyVals[0+yyTop])); } -void case_844() -#line 5589 "cs-parser.jay" +void case_848() +#line 5613 "cs-parser.jay" { yyVal = new GotoCase ((Expression) yyVals[-1+yyTop], GetLocation (yyVals[-3+yyTop])); lbag.AddStatement (yyVal, GetLocation (yyVals[-2+yyTop]), GetLocation (yyVals[0+yyTop])); } -void case_845() -#line 5594 "cs-parser.jay" +void case_849() +#line 5618 "cs-parser.jay" { yyVal = new GotoDefault (GetLocation (yyVals[-2+yyTop])); lbag.AddStatement (yyVal, GetLocation (yyVals[-1+yyTop]), GetLocation (yyVals[0+yyTop])); } -void case_846() -#line 5602 "cs-parser.jay" +void case_850() +#line 5626 "cs-parser.jay" { yyVal = new Return ((Expression) yyVals[-1+yyTop], GetLocation (yyVals[-2+yyTop])); lbag.AddStatement (yyVal, GetLocation (yyVals[0+yyTop])); } -void case_847() -#line 5610 "cs-parser.jay" +void case_851() +#line 5631 "cs-parser.jay" +{ + Error_SyntaxError (yyToken); + yyVal = new Return (null, GetLocation (yyVals[-1+yyTop])); + } + +void case_852() +#line 5639 "cs-parser.jay" { yyVal = new Throw ((Expression) yyVals[-1+yyTop], GetLocation (yyVals[-2+yyTop])); lbag.AddStatement (yyVal, GetLocation (yyVals[0+yyTop])); } -void case_848() -#line 5618 "cs-parser.jay" +void case_853() +#line 5644 "cs-parser.jay" +{ + Error_SyntaxError (yyToken); + yyVal = new Throw (null, GetLocation (yyVals[-1+yyTop])); + } + +void case_854() +#line 5652 "cs-parser.jay" { var lt = (Tokenizer.LocatedToken) yyVals[-3+yyTop]; string s = lt.Value; @@ -8332,8 +8415,8 @@ void case_848() lbag.AddStatement (yyVal, GetLocation (yyVals[-2+yyTop]), GetLocation (yyVals[0+yyTop])); } -void case_849() -#line 5634 "cs-parser.jay" +void case_855() +#line 5668 "cs-parser.jay" { var lt = (Tokenizer.LocatedToken) yyVals[-2+yyTop]; string s = lt.Value; @@ -8348,30 +8431,30 @@ void case_849() lbag.AddStatement (yyVal, GetLocation (yyVals[-1+yyTop]), GetLocation (yyVals[0+yyTop])); } -void case_853() -#line 5660 "cs-parser.jay" +void case_859() +#line 5694 "cs-parser.jay" { yyVal = new TryFinally ((Statement) yyVals[-2+yyTop], (Block) yyVals[0+yyTop], GetLocation (yyVals[-3+yyTop])); lbag.AddStatement (yyVal, GetLocation (yyVals[-1+yyTop])); } -void case_854() -#line 5665 "cs-parser.jay" +void case_860() +#line 5699 "cs-parser.jay" { var loc = GetLocation (yyVals[-4+yyTop]); yyVal = new TryFinally (new TryCatch ((Block) yyVals[-3+yyTop], (List) yyVals[-2+yyTop], loc, true), (Block) yyVals[0+yyTop], loc); lbag.AddStatement (yyVal, GetLocation (yyVals[-1+yyTop])); } -void case_855() -#line 5671 "cs-parser.jay" +void case_861() +#line 5705 "cs-parser.jay" { Error_SyntaxError (1524, yyToken); yyVal = new TryCatch ((Block) yyVals[-1+yyTop], null, GetLocation (yyVals[-2+yyTop]), false); } -void case_856() -#line 5679 "cs-parser.jay" +void case_862() +#line 5713 "cs-parser.jay" { var l = new List (2); @@ -8379,8 +8462,8 @@ void case_856() yyVal = l; } -void case_857() -#line 5686 "cs-parser.jay" +void case_863() +#line 5720 "cs-parser.jay" { var l = (List) yyVals[-1+yyTop]; @@ -8393,8 +8476,8 @@ void case_857() yyVal = l; } -void case_861() -#line 5710 "cs-parser.jay" +void case_867() +#line 5744 "cs-parser.jay" { start_block (GetLocation (yyVals[-3+yyTop])); var c = new Catch (current_block, GetLocation (yyVals[-4+yyTop])); @@ -8410,8 +8493,8 @@ void case_861() yyVal = c; } -void case_863() -#line 5729 "cs-parser.jay" +void case_869() +#line 5763 "cs-parser.jay" { if (yyToken == Token.CLOSE_PARENS) { report.Error (1015, lexer.Location, @@ -8423,15 +8506,15 @@ void case_863() yyVal = new Catch (null, GetLocation (yyVals[-2+yyTop])); } -void case_866() -#line 5757 "cs-parser.jay" +void case_872() +#line 5791 "cs-parser.jay" { if (!settings.Unsafe) Error_UnsafeCodeNotAllowed (GetLocation (yyVals[0+yyTop])); } -void case_868() -#line 5767 "cs-parser.jay" +void case_874() +#line 5801 "cs-parser.jay" { if (yyVals[0+yyTop] is EmptyStatement && lexer.peek_token () == Token.OPEN_BRACE) Warning_EmptyStatement (GetLocation (yyVals[0+yyTop])); @@ -8440,8 +8523,8 @@ void case_868() lbag.AddStatement (yyVal, GetLocation (yyVals[-3+yyTop]), GetLocation (yyVals[-1+yyTop])); } -void case_869() -#line 5775 "cs-parser.jay" +void case_875() +#line 5809 "cs-parser.jay" { Error_SyntaxError (yyToken); @@ -8449,8 +8532,8 @@ void case_869() lbag.AddStatement (yyVal, GetLocation (yyVals[-2+yyTop])); } -void case_870() -#line 5785 "cs-parser.jay" +void case_876() +#line 5819 "cs-parser.jay" { start_block (GetLocation (yyVals[-2+yyTop])); @@ -8461,15 +8544,15 @@ void case_870() current_variable = new Fixed.VariableDeclaration ((FullNamedExpression) yyVals[-1+yyTop], li); } -void case_871() -#line 5795 "cs-parser.jay" +void case_877() +#line 5829 "cs-parser.jay" { yyVal = current_variable; current_variable = null; } -void case_872() -#line 5800 "cs-parser.jay" +void case_878() +#line 5834 "cs-parser.jay" { if (yyVals[0+yyTop] is EmptyStatement && lexer.peek_token () == Token.OPEN_BRACE) Warning_EmptyStatement (GetLocation (yyVals[0+yyTop])); @@ -8480,8 +8563,8 @@ void case_872() yyVal = end_block (GetLocation (yyVals[-2+yyTop])); } -void case_873() -#line 5813 "cs-parser.jay" +void case_879() +#line 5847 "cs-parser.jay" { start_block (GetLocation (yyVals[-2+yyTop])); @@ -8492,15 +8575,15 @@ void case_873() current_variable = new Using.VariableDeclaration ((FullNamedExpression) yyVals[-1+yyTop], li); } -void case_874() -#line 5823 "cs-parser.jay" +void case_880() +#line 5857 "cs-parser.jay" { yyVal = current_variable; current_variable = null; } -void case_875() -#line 5828 "cs-parser.jay" +void case_881() +#line 5862 "cs-parser.jay" { if (yyVals[0+yyTop] is EmptyStatement && lexer.peek_token () == Token.OPEN_BRACE) Warning_EmptyStatement (GetLocation (yyVals[0+yyTop])); @@ -8511,8 +8594,8 @@ void case_875() yyVal = end_block (GetLocation (yyVals[-2+yyTop])); } -void case_876() -#line 5838 "cs-parser.jay" +void case_882() +#line 5872 "cs-parser.jay" { if (yyVals[0+yyTop] is EmptyStatement && lexer.peek_token () == Token.OPEN_BRACE) Warning_EmptyStatement (GetLocation (yyVals[0+yyTop])); @@ -8521,8 +8604,8 @@ void case_876() lbag.AddStatement (yyVal, GetLocation (yyVals[-3+yyTop]), GetLocation (yyVals[-1+yyTop])); } -void case_877() -#line 5846 "cs-parser.jay" +void case_883() +#line 5880 "cs-parser.jay" { Error_SyntaxError (yyToken); @@ -8530,23 +8613,23 @@ void case_877() lbag.AddStatement (yyVal, GetLocation (yyVals[-2+yyTop])); } -void case_879() -#line 5857 "cs-parser.jay" +void case_885() +#line 5891 "cs-parser.jay" { /* It has to be here for the parent to safely restore artificial block*/ Error_SyntaxError (yyToken); } -void case_881() -#line 5869 "cs-parser.jay" +void case_887() +#line 5903 "cs-parser.jay" { current_variable.Initializer = (Expression) yyVals[0+yyTop]; lbag.AppendTo (current_variable, GetLocation (yyVals[-1+yyTop])); yyVal = current_variable; } -void case_882() -#line 5881 "cs-parser.jay" +void case_888() +#line 5915 "cs-parser.jay" { lexer.query_parsing = false; @@ -8559,8 +8642,8 @@ void case_882() current_block = current_block.Parent; } -void case_883() -#line 5893 "cs-parser.jay" +void case_889() +#line 5927 "cs-parser.jay" { Linq.AQueryClause from = yyVals[-1+yyTop] as Linq.AQueryClause; @@ -8571,8 +8654,8 @@ void case_883() current_block = current_block.Parent; } -void case_884() -#line 5904 "cs-parser.jay" +void case_890() +#line 5938 "cs-parser.jay" { lexer.query_parsing = false; yyVal = yyVals[-1+yyTop]; @@ -8581,16 +8664,16 @@ void case_884() current_block = current_block.Parent; } -void case_885() -#line 5911 "cs-parser.jay" +void case_891() +#line 5945 "cs-parser.jay" { yyVal = yyVals[-1+yyTop]; current_block.SetEndLocation (lexer.Location); current_block = current_block.Parent; } -void case_886() -#line 5920 "cs-parser.jay" +void case_892() +#line 5954 "cs-parser.jay" { current_block = new Linq.QueryBlock (current_block, lexer.Location); @@ -8601,8 +8684,8 @@ void case_886() yyVal = new Linq.QueryExpression (start); } -void case_887() -#line 5930 "cs-parser.jay" +void case_893() +#line 5964 "cs-parser.jay" { current_block = new Linq.QueryBlock (current_block, lexer.Location); @@ -8615,8 +8698,8 @@ void case_887() yyVal = new Linq.QueryExpression (start); } -void case_888() -#line 5945 "cs-parser.jay" +void case_894() +#line 5979 "cs-parser.jay" { current_block = new Linq.QueryBlock (current_block, lexer.Location); @@ -8627,8 +8710,8 @@ void case_888() yyVal = new Linq.QueryExpression (start); } -void case_889() -#line 5955 "cs-parser.jay" +void case_895() +#line 5989 "cs-parser.jay" { current_block = new Linq.QueryBlock (current_block, lexer.Location); @@ -8641,8 +8724,8 @@ void case_889() yyVal = new Linq.QueryExpression (start); } -void case_891() -#line 5974 "cs-parser.jay" +void case_897() +#line 6008 "cs-parser.jay" { var lt = (Tokenizer.LocatedToken) yyVals[-3+yyTop]; var sn = new Linq.RangeVariable (lt.Value, lt.Location); @@ -8655,8 +8738,8 @@ void case_891() lbag.AddLocation (yyVal, GetLocation (yyVals[-2+yyTop])); } -void case_893() -#line 5990 "cs-parser.jay" +void case_899() +#line 6024 "cs-parser.jay" { var lt = (Tokenizer.LocatedToken) yyVals[-3+yyTop]; var sn = new Linq.RangeVariable (lt.Value, lt.Location); @@ -8673,8 +8756,8 @@ void case_893() lbag.AddLocation (yyVal, GetLocation (yyVals[-2+yyTop])); } -void case_894() -#line 6009 "cs-parser.jay" +void case_900() +#line 6043 "cs-parser.jay" { Linq.AQueryClause head = (Linq.AQueryClause)yyVals[-1+yyTop]; @@ -8690,15 +8773,36 @@ void case_894() yyVal = head; } -void case_896() -#line 6025 "cs-parser.jay" +void case_901() +#line 6058 "cs-parser.jay" +{ + Linq.AQueryClause head = (Linq.AQueryClause)yyVals[0+yyTop]; + + if (yyVals[-1+yyTop] != null) { + Linq.AQueryClause clause = (Linq.AQueryClause)yyVals[-1+yyTop]; + clause.Tail.Next = head; + head = clause; + } + + yyVal = head; + } + +void case_903() +#line 6071 "cs-parser.jay" +{ + report.Error (742, GetLocation (yyVals[0+yyTop]), "Unexpected symbol `{0}'. A query body must end with select or group clause", GetSymbolName (yyToken)); + yyVal = yyVals[-1+yyTop]; + } + +void case_904() +#line 6076 "cs-parser.jay" { Error_SyntaxError (yyToken); yyVal = null; } -void case_898() -#line 6037 "cs-parser.jay" +void case_906() +#line 6088 "cs-parser.jay" { yyVal = new Linq.Select ((Linq.QueryBlock)current_block, (Expression)yyVals[0+yyTop], GetLocation (yyVals[-2+yyTop])); @@ -8706,8 +8810,8 @@ void case_898() current_block = current_block.Parent; } -void case_899() -#line 6044 "cs-parser.jay" +void case_907() +#line 6095 "cs-parser.jay" { if (linq_clause_blocks == null) linq_clause_blocks = new Stack (); @@ -8716,8 +8820,8 @@ void case_899() linq_clause_blocks.Push ((Linq.QueryBlock)current_block); } -void case_900() -#line 6052 "cs-parser.jay" +void case_908() +#line 6103 "cs-parser.jay" { current_block.SetEndLocation (lexer.Location); current_block = current_block.Parent; @@ -8725,8 +8829,8 @@ void case_900() current_block = new Linq.QueryBlock (current_block, lexer.Location); } -void case_901() -#line 6059 "cs-parser.jay" +void case_909() +#line 6110 "cs-parser.jay" { yyVal = new Linq.GroupBy ((Linq.QueryBlock)current_block, (Expression)yyVals[-3+yyTop], linq_clause_blocks.Pop (), (Expression)yyVals[0+yyTop], GetLocation (yyVals[-5+yyTop])); lbag.AddLocation (yyVal, GetLocation (yyVals[-1+yyTop])); @@ -8735,15 +8839,15 @@ void case_901() current_block = current_block.Parent; } -void case_905() -#line 6076 "cs-parser.jay" +void case_911() +#line 6122 "cs-parser.jay" { ((Linq.AQueryClause)yyVals[-1+yyTop]).Tail.Next = (Linq.AQueryClause)yyVals[0+yyTop]; yyVal = yyVals[-1+yyTop]; } -void case_912() -#line 6096 "cs-parser.jay" +void case_918() +#line 6142 "cs-parser.jay" { var lt = (Tokenizer.LocatedToken) yyVals[-3+yyTop]; var sn = new Linq.RangeVariable (lt.Value, lt.Location); @@ -8756,8 +8860,8 @@ void case_912() ((Linq.QueryBlock)current_block).AddRangeVariable (sn); } -void case_914() -#line 6115 "cs-parser.jay" +void case_920() +#line 6161 "cs-parser.jay" { yyVal = new Linq.Where ((Linq.QueryBlock)current_block, (Expression)yyVals[0+yyTop], GetLocation (yyVals[-2+yyTop])); @@ -8765,8 +8869,8 @@ void case_914() current_block = current_block.Parent; } -void case_915() -#line 6125 "cs-parser.jay" +void case_921() +#line 6171 "cs-parser.jay" { if (linq_clause_blocks == null) linq_clause_blocks = new Stack (); @@ -8775,8 +8879,8 @@ void case_915() linq_clause_blocks.Push ((Linq.QueryBlock) current_block); } -void case_916() -#line 6133 "cs-parser.jay" +void case_922() +#line 6179 "cs-parser.jay" { current_block.SetEndLocation (lexer.Location); current_block = current_block.Parent; @@ -8785,8 +8889,8 @@ void case_916() linq_clause_blocks.Push ((Linq.QueryBlock) current_block); } -void case_917() -#line 6141 "cs-parser.jay" +void case_923() +#line 6187 "cs-parser.jay" { current_block.AddStatement (new ContextualReturn ((Expression) yyVals[-1+yyTop])); current_block.SetEndLocation (lexer.Location); @@ -8795,8 +8899,8 @@ void case_917() current_block = new Linq.QueryBlock (current_block, lexer.Location); } -void case_918() -#line 6149 "cs-parser.jay" +void case_924() +#line 6195 "cs-parser.jay" { current_block.AddStatement (new ContextualReturn ((Expression) yyVals[-1+yyTop])); current_block.SetEndLocation (lexer.Location); @@ -8835,8 +8939,8 @@ void case_918() ((Linq.QueryBlock)current_block).AddRangeVariable (into); } -void case_919() -#line 6187 "cs-parser.jay" +void case_925() +#line 6233 "cs-parser.jay" { if (linq_clause_blocks == null) linq_clause_blocks = new Stack (); @@ -8845,8 +8949,8 @@ void case_919() linq_clause_blocks.Push ((Linq.QueryBlock) current_block); } -void case_920() -#line 6195 "cs-parser.jay" +void case_926() +#line 6241 "cs-parser.jay" { current_block.SetEndLocation (lexer.Location); current_block = current_block.Parent; @@ -8855,8 +8959,8 @@ void case_920() linq_clause_blocks.Push ((Linq.QueryBlock) current_block); } -void case_921() -#line 6203 "cs-parser.jay" +void case_927() +#line 6249 "cs-parser.jay" { current_block.AddStatement (new ContextualReturn ((Expression) yyVals[-1+yyTop])); current_block.SetEndLocation (lexer.Location); @@ -8865,8 +8969,8 @@ void case_921() current_block = new Linq.QueryBlock (current_block, lexer.Location); } -void case_922() -#line 6211 "cs-parser.jay" +void case_928() +#line 6257 "cs-parser.jay" { current_block.AddStatement (new ContextualReturn ((Expression) yyVals[-1+yyTop])); current_block.SetEndLocation (lexer.Location); @@ -8909,15 +9013,15 @@ void case_922() ((Linq.QueryBlock)current_block).AddRangeVariable (into); } -void case_924() -#line 6257 "cs-parser.jay" +void case_930() +#line 6303 "cs-parser.jay" { opt_intoStack.Push (GetLocation (yyVals[-1+yyTop])); yyVal = yyVals[0+yyTop]; } -void case_926() -#line 6269 "cs-parser.jay" +void case_932() +#line 6315 "cs-parser.jay" { current_block.SetEndLocation (lexer.Location); current_block = current_block.Parent; @@ -8925,8 +9029,8 @@ void case_926() yyVal = yyVals[0+yyTop]; } -void case_928() -#line 6280 "cs-parser.jay" +void case_934() +#line 6326 "cs-parser.jay" { current_block.SetEndLocation (lexer.Location); current_block = current_block.Parent; @@ -8934,15 +9038,15 @@ void case_928() current_block = new Linq.QueryBlock (current_block, lexer.Location); } -void case_929() -#line 6287 "cs-parser.jay" +void case_935() +#line 6333 "cs-parser.jay" { ((Linq.AQueryClause)yyVals[-3+yyTop]).Next = (Linq.AQueryClause)yyVals[0+yyTop]; yyVal = yyVals[-3+yyTop]; } -void case_931() -#line 6296 "cs-parser.jay" +void case_937() +#line 6342 "cs-parser.jay" { current_block.SetEndLocation (lexer.Location); current_block = current_block.Parent; @@ -8950,43 +9054,43 @@ void case_931() current_block = new Linq.QueryBlock ((Linq.QueryBlock) current_block, lexer.Location); } -void case_932() -#line 6303 "cs-parser.jay" +void case_938() +#line 6349 "cs-parser.jay" { ((Linq.AQueryClause)yyVals[-3+yyTop]).Tail.Next = (Linq.AQueryClause)yyVals[0+yyTop]; yyVal = yyVals[-3+yyTop]; } -void case_934() -#line 6315 "cs-parser.jay" +void case_940() +#line 6361 "cs-parser.jay" { yyVal = new Linq.OrderByAscending ((Linq.QueryBlock) current_block, (Expression)yyVals[-1+yyTop]); lbag.AddLocation (yyVal, GetLocation (yyVals[0+yyTop])); } -void case_935() -#line 6320 "cs-parser.jay" +void case_941() +#line 6366 "cs-parser.jay" { yyVal = new Linq.OrderByDescending ((Linq.QueryBlock) current_block, (Expression)yyVals[-1+yyTop]); lbag.AddLocation (yyVal, GetLocation (yyVals[0+yyTop])); } -void case_937() -#line 6332 "cs-parser.jay" +void case_943() +#line 6378 "cs-parser.jay" { yyVal = new Linq.ThenByAscending ((Linq.QueryBlock) current_block, (Expression)yyVals[-1+yyTop]); lbag.AddLocation (yyVal, GetLocation (yyVals[0+yyTop])); } -void case_938() -#line 6337 "cs-parser.jay" +void case_944() +#line 6383 "cs-parser.jay" { yyVal = new Linq.ThenByDescending ((Linq.QueryBlock) current_block, (Expression)yyVals[-1+yyTop]); lbag.AddLocation (yyVal, GetLocation (yyVals[0+yyTop])); } -void case_940() -#line 6347 "cs-parser.jay" +void case_946() +#line 6393 "cs-parser.jay" { /* query continuation block is not linked with query block but with block*/ /* before. This means each query can use same range variable names for*/ @@ -9003,8 +9107,8 @@ void case_940() linq_clause_blocks.Push ((Linq.QueryBlock) current_block); } -void case_941() -#line 6363 "cs-parser.jay" +void case_947() +#line 6409 "cs-parser.jay" { var current_block = linq_clause_blocks.Pop (); var lt = (Tokenizer.LocatedToken) yyVals[-2+yyTop]; @@ -9014,8 +9118,8 @@ void case_941() }; } -void case_944() -#line 6390 "cs-parser.jay" +void case_950() +#line 6436 "cs-parser.jay" { current_container = current_type = new Class (current_container, new MemberName (""), Modifiers.PUBLIC, null); @@ -9044,8 +9148,8 @@ void case_944() start_block (lexer.Location); } -void case_945() -#line 6418 "cs-parser.jay" +void case_951() +#line 6464 "cs-parser.jay" { --lexer.parsing_block; Method method = (Method) oob_stack.Pop (); @@ -9056,16 +9160,16 @@ void case_945() current_local_parameters = null; } -void case_955() -#line 6461 "cs-parser.jay" +void case_961() +#line 6507 "cs-parser.jay" { module.DocumentationBuilder.ParsedBuiltinType = (TypeExpression)yyVals[-1+yyTop]; module.DocumentationBuilder.ParsedParameters = (List)yyVals[0+yyTop]; yyVal = null; } -void case_956() -#line 6467 "cs-parser.jay" +void case_962() +#line 6513 "cs-parser.jay" { module.DocumentationBuilder.ParsedBuiltinType = (TypeExpression)yyVals[-3+yyTop]; module.DocumentationBuilder.ParsedParameters = (List)yyVals[0+yyTop]; @@ -9073,15 +9177,15 @@ void case_956() yyVal = new MemberName (lt.Value); } -void case_959() -#line 6482 "cs-parser.jay" +void case_965() +#line 6528 "cs-parser.jay" { module.DocumentationBuilder.ParsedParameters = (List)yyVals[-1+yyTop]; yyVal = new MemberName ((MemberName) yyVals[-6+yyTop], MemberCache.IndexerNameAlias, Location.Null); } -void case_960() -#line 6487 "cs-parser.jay" +void case_966() +#line 6533 "cs-parser.jay" { var p = (List)yyVals[0+yyTop] ?? new List (1); p.Add (new DocumentationParameter ((FullNamedExpression) yyVals[-1+yyTop])); @@ -9090,8 +9194,8 @@ void case_960() yyVal = null; } -void case_961() -#line 6495 "cs-parser.jay" +void case_967() +#line 6541 "cs-parser.jay" { var p = (List)yyVals[0+yyTop] ?? new List (1); p.Add (new DocumentationParameter ((FullNamedExpression) yyVals[-1+yyTop])); @@ -9100,8 +9204,8 @@ void case_961() yyVal = null; } -void case_962() -#line 6503 "cs-parser.jay" +void case_968() +#line 6549 "cs-parser.jay" { var p = (List)yyVals[0+yyTop] ?? new List (1); module.DocumentationBuilder.ParsedParameters = p; @@ -9109,24 +9213,24 @@ void case_962() yyVal = null; } -void case_970() -#line 6541 "cs-parser.jay" +void case_976() +#line 6587 "cs-parser.jay" { var parameters = new List (); parameters.Add ((DocumentationParameter) yyVals[0+yyTop]); yyVal = parameters; } -void case_971() -#line 6547 "cs-parser.jay" +void case_977() +#line 6593 "cs-parser.jay" { var parameters = yyVals[-2+yyTop] as List; parameters.Add ((DocumentationParameter) yyVals[0+yyTop]); yyVal = parameters; } -void case_972() -#line 6556 "cs-parser.jay" +void case_978() +#line 6602 "cs-parser.jay" { if (yyVals[-1+yyTop] != null) yyVal = new DocumentationParameter ((Parameter.Modifier) yyVals[-1+yyTop], (FullNamedExpression) yyVals[0+yyTop]); @@ -9153,87 +9257,87 @@ void case_972() 100, 54, 103, 104, 98, 105, 106, 107, 98, 98, 98, 99, 99, 102, 102, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 111, 111, 114, 114, 114, - 117, 114, 115, 115, 118, 118, 119, 119, 119, 112, - 112, 112, 120, 120, 120, 113, 122, 124, 125, 55, - 127, 128, 129, 57, 123, 123, 123, 123, 123, 133, - 130, 134, 131, 132, 132, 132, 135, 136, 137, 139, - 28, 28, 138, 138, 140, 140, 141, 141, 141, 141, - 141, 141, 141, 141, 141, 144, 58, 143, 143, 145, - 145, 148, 142, 142, 147, 147, 147, 147, 147, 147, + 114, 117, 114, 115, 115, 118, 118, 119, 119, 119, + 112, 112, 112, 120, 120, 120, 113, 122, 124, 125, + 55, 127, 128, 129, 57, 123, 123, 123, 123, 123, + 133, 130, 134, 131, 132, 132, 132, 135, 136, 137, + 139, 28, 28, 138, 138, 140, 140, 141, 141, 141, + 141, 141, 141, 141, 141, 141, 144, 58, 143, 143, + 145, 145, 148, 142, 142, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, - 147, 147, 147, 147, 147, 147, 150, 149, 151, 149, - 149, 149, 59, 154, 156, 152, 153, 153, 155, 155, - 160, 158, 161, 158, 158, 158, 162, 60, 164, 56, - 167, 168, 56, 163, 170, 163, 165, 165, 171, 171, - 172, 173, 172, 174, 169, 166, 166, 166, 166, 166, - 178, 175, 179, 176, 177, 177, 61, 181, 183, 184, - 29, 180, 180, 180, 182, 182, 182, 185, 185, 186, - 187, 186, 188, 189, 190, 30, 191, 191, 16, 16, - 192, 192, 195, 194, 194, 194, 196, 196, 198, 64, - 121, 101, 101, 126, 126, 199, 199, 199, 197, 197, - 200, 200, 201, 201, 203, 203, 82, 72, 72, 86, - 86, 116, 116, 146, 146, 204, 204, 204, 204, 204, - 208, 208, 209, 207, 207, 207, 207, 207, 207, 207, - 210, 210, 210, 210, 210, 210, 210, 210, 210, 211, + 147, 147, 147, 147, 147, 147, 147, 150, 149, 151, + 149, 149, 149, 59, 154, 156, 152, 153, 153, 155, + 155, 160, 158, 161, 158, 158, 158, 162, 60, 164, + 56, 167, 168, 56, 163, 170, 163, 165, 165, 171, + 171, 172, 173, 172, 174, 169, 166, 166, 166, 166, + 166, 178, 175, 179, 176, 177, 177, 61, 181, 183, + 184, 29, 180, 180, 180, 182, 182, 182, 185, 185, + 186, 187, 186, 188, 189, 190, 30, 191, 191, 16, + 16, 192, 192, 195, 194, 194, 194, 196, 196, 198, + 64, 121, 101, 101, 126, 126, 199, 199, 199, 197, + 197, 200, 200, 201, 201, 203, 203, 82, 72, 72, + 86, 86, 116, 116, 146, 146, 204, 204, 204, 204, + 204, 208, 208, 209, 207, 207, 207, 207, 207, 207, + 207, 210, 210, 210, 210, 210, 210, 210, 210, 210, 211, 211, 211, 211, 211, 211, 211, 211, 211, 211, - 211, 211, 211, 211, 211, 211, 211, 211, 211, 212, - 212, 212, 213, 213, 213, 233, 233, 234, 234, 235, - 235, 215, 215, 232, 232, 232, 232, 232, 232, 232, - 232, 217, 236, 236, 237, 237, 238, 238, 240, 240, - 240, 241, 241, 241, 241, 241, 242, 242, 159, 159, - 246, 246, 246, 246, 246, 248, 248, 247, 247, 249, - 249, 249, 249, 250, 218, 218, 218, 245, 245, 245, - 251, 251, 252, 252, 219, 220, 220, 221, 222, 223, - 223, 214, 214, 214, 214, 214, 257, 253, 224, 258, - 258, 259, 259, 260, 260, 261, 261, 261, 261, 254, - 254, 205, 205, 256, 256, 262, 262, 255, 255, 81, - 81, 263, 263, 264, 225, 265, 265, 265, 266, 266, - 266, 266, 266, 267, 193, 226, 227, 228, 229, 269, - 230, 270, 230, 268, 268, 272, 271, 216, 273, 273, - 273, 273, 273, 274, 274, 274, 274, 274, 274, 274, - 275, 275, 275, 275, 276, 276, 276, 276, 276, 276, - 277, 277, 277, 278, 278, 278, 278, 278, 279, 279, - 279, 280, 280, 281, 281, 282, 282, 283, 283, 284, - 284, 285, 285, 286, 286, 288, 288, 288, 288, 288, - 288, 288, 288, 288, 288, 288, 289, 289, 290, 290, - 290, 291, 291, 292, 292, 294, 293, 287, 287, 296, - 295, 297, 295, 298, 299, 295, 300, 301, 295, 44, - 44, 243, 243, 243, 243, 231, 231, 231, 80, 303, - 304, 305, 306, 307, 26, 63, 63, 62, 62, 108, - 108, 308, 308, 308, 308, 308, 308, 308, 308, 308, - 308, 308, 308, 308, 308, 308, 66, 66, 66, 68, - 68, 309, 309, 310, 310, 311, 311, 312, 312, 312, - 312, 202, 202, 313, 313, 315, 109, 316, 316, 317, - 157, 157, 314, 314, 318, 318, 319, 319, 319, 319, - 319, 323, 323, 324, 324, 324, 321, 321, 321, 321, - 321, 321, 321, 321, 321, 321, 321, 321, 321, 325, - 325, 325, 325, 325, 325, 325, 325, 325, 325, 325, - 325, 325, 339, 339, 339, 339, 326, 340, 322, 341, - 341, 342, 342, 342, 342, 342, 342, 206, 206, 343, - 47, 47, 345, 320, 349, 320, 347, 347, 344, 344, - 344, 344, 346, 346, 353, 353, 352, 352, 354, 354, - 348, 348, 350, 350, 355, 355, 356, 351, 351, 351, - 327, 327, 327, 338, 338, 357, 358, 358, 328, 328, - 359, 359, 359, 362, 360, 360, 361, 361, 363, 363, - 363, 366, 364, 365, 365, 367, 367, 329, 329, 329, - 329, 368, 368, 369, 369, 369, 373, 370, 376, 372, - 372, 379, 375, 375, 378, 378, 374, 374, 382, 381, - 381, 377, 377, 380, 380, 384, 383, 383, 371, 371, - 385, 371, 371, 371, 330, 330, 330, 330, 330, 330, - 386, 387, 388, 388, 388, 389, 390, 391, 391, 392, - 392, 331, 331, 331, 331, 393, 393, 395, 395, 394, - 396, 394, 394, 332, 333, 397, 336, 334, 334, 399, - 400, 337, 402, 403, 335, 335, 335, 401, 401, 398, - 398, 302, 302, 302, 302, 404, 404, 406, 406, 408, - 407, 409, 407, 405, 405, 405, 413, 411, 414, 415, - 411, 410, 410, 416, 416, 417, 417, 417, 417, 417, - 422, 418, 423, 419, 424, 425, 426, 420, 428, 429, - 430, 420, 427, 427, 432, 421, 431, 435, 431, 434, - 437, 434, 433, 433, 433, 436, 436, 436, 412, 438, - 412, 3, 3, 439, 3, 3, 440, 440, 244, 244, - 239, 239, 5, 441, 441, 441, 441, 445, 441, 441, - 441, 441, 442, 442, 443, 446, 443, 444, 444, 447, - 447, 448, + 211, 211, 211, 211, 211, 211, 211, 211, 211, 211, + 212, 212, 212, 213, 213, 213, 233, 233, 234, 234, + 235, 235, 215, 215, 232, 232, 232, 232, 232, 232, + 232, 232, 217, 236, 236, 237, 237, 238, 238, 240, + 240, 240, 241, 241, 241, 241, 241, 242, 242, 159, + 159, 246, 246, 246, 246, 246, 248, 248, 247, 247, + 249, 249, 249, 249, 250, 218, 218, 218, 245, 245, + 245, 251, 251, 252, 252, 219, 220, 220, 221, 222, + 223, 223, 214, 214, 214, 214, 214, 257, 253, 224, + 258, 258, 259, 259, 260, 260, 261, 261, 261, 261, + 254, 254, 205, 205, 256, 256, 262, 262, 255, 255, + 81, 81, 263, 263, 264, 225, 265, 265, 265, 266, + 266, 266, 266, 266, 267, 193, 226, 227, 228, 229, + 269, 230, 270, 230, 268, 268, 272, 271, 216, 273, + 273, 273, 273, 273, 274, 274, 274, 274, 274, 274, + 274, 275, 275, 275, 275, 276, 276, 276, 276, 276, + 276, 277, 277, 277, 278, 278, 278, 278, 278, 279, + 279, 279, 280, 280, 281, 281, 282, 282, 283, 283, + 284, 284, 285, 285, 286, 286, 286, 288, 288, 288, + 288, 288, 288, 288, 288, 288, 288, 288, 289, 289, + 290, 290, 290, 291, 291, 292, 292, 294, 293, 287, + 287, 296, 295, 297, 295, 298, 299, 295, 300, 301, + 295, 44, 44, 243, 243, 243, 243, 231, 231, 231, + 80, 303, 304, 305, 306, 307, 26, 63, 63, 62, + 62, 108, 108, 308, 308, 308, 308, 308, 308, 308, + 308, 308, 308, 308, 308, 308, 308, 308, 66, 66, + 66, 68, 68, 309, 309, 310, 310, 311, 311, 312, + 312, 312, 312, 202, 202, 313, 313, 315, 109, 316, + 316, 317, 157, 157, 314, 314, 318, 318, 319, 319, + 319, 319, 319, 323, 323, 324, 324, 324, 321, 321, + 321, 321, 321, 321, 321, 321, 321, 321, 321, 321, + 321, 325, 325, 325, 325, 325, 325, 325, 325, 325, + 325, 325, 325, 325, 339, 339, 339, 339, 326, 340, + 322, 341, 341, 342, 342, 342, 342, 342, 342, 206, + 206, 343, 47, 47, 345, 320, 349, 320, 347, 347, + 344, 344, 344, 344, 346, 346, 353, 353, 352, 352, + 354, 354, 348, 348, 350, 350, 355, 355, 356, 351, + 351, 351, 327, 327, 327, 338, 338, 357, 358, 358, + 328, 328, 359, 359, 359, 362, 360, 360, 361, 361, + 363, 363, 363, 366, 364, 365, 365, 367, 367, 367, + 329, 329, 329, 329, 368, 368, 369, 369, 369, 373, + 370, 376, 372, 372, 379, 375, 375, 378, 378, 374, + 374, 382, 381, 381, 377, 377, 380, 380, 384, 383, + 383, 371, 371, 385, 371, 371, 371, 330, 330, 330, + 330, 330, 330, 386, 387, 387, 388, 388, 388, 389, + 389, 390, 390, 391, 391, 392, 392, 331, 331, 331, + 331, 393, 393, 395, 395, 394, 396, 394, 394, 332, + 333, 397, 336, 334, 334, 399, 400, 337, 402, 403, + 335, 335, 335, 401, 401, 398, 398, 302, 302, 302, + 302, 404, 404, 406, 406, 408, 407, 409, 407, 405, + 405, 405, 405, 405, 413, 411, 414, 415, 411, 410, + 410, 416, 416, 416, 416, 416, 421, 417, 422, 418, + 423, 424, 425, 419, 427, 428, 429, 419, 426, 426, + 431, 420, 430, 434, 430, 433, 436, 433, 432, 432, + 432, 435, 435, 435, 412, 437, 412, 3, 3, 438, + 3, 3, 439, 439, 244, 244, 239, 239, 5, 440, + 440, 440, 440, 444, 440, 440, 440, 440, 441, 441, + 442, 445, 442, 443, 443, 446, 446, 447, }; static readonly short [] yyLen = { 2, 2, 0, 3, 1, 2, 4, 3, 1, 0, 1, @@ -9252,1002 +9356,1034 @@ void case_972() 1, 1, 2, 3, 0, 4, 2, 1, 1, 1, 0, 3, 0, 0, 10, 0, 0, 0, 12, 8, 5, 1, 1, 0, 1, 1, 3, 3, 3, 5, - 3, 5, 1, 1, 1, 1, 3, 4, 6, 4, - 0, 7, 0, 1, 1, 2, 1, 1, 1, 4, - 6, 4, 1, 2, 2, 1, 0, 0, 0, 10, - 0, 0, 0, 13, 1, 2, 1, 2, 1, 0, - 5, 0, 5, 1, 1, 1, 0, 0, 0, 0, - 15, 5, 0, 1, 1, 2, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 0, 5, 1, 1, 1, - 1, 0, 7, 1, 1, 1, 1, 1, 1, 1, + 3, 5, 1, 1, 1, 1, 3, 4, 6, 2, + 4, 0, 7, 0, 1, 1, 2, 1, 1, 1, + 4, 6, 4, 1, 2, 2, 1, 0, 0, 0, + 10, 0, 0, 0, 13, 1, 2, 1, 2, 1, + 0, 5, 0, 5, 1, 1, 1, 0, 0, 0, + 0, 15, 5, 0, 1, 1, 2, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 0, 5, 1, 1, + 1, 1, 0, 7, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 0, 7, 0, + 7, 2, 2, 2, 0, 0, 9, 1, 1, 0, + 1, 0, 6, 0, 6, 2, 1, 0, 8, 0, + 9, 0, 0, 10, 0, 0, 3, 0, 1, 1, + 2, 2, 0, 5, 0, 2, 2, 2, 1, 1, + 1, 0, 5, 0, 5, 1, 1, 2, 0, 0, + 0, 12, 0, 2, 2, 0, 1, 2, 1, 3, + 2, 0, 5, 0, 0, 0, 13, 0, 1, 1, + 3, 1, 4, 2, 0, 3, 2, 1, 3, 0, + 3, 1, 1, 3, 1, 2, 3, 4, 4, 0, + 3, 1, 3, 3, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, + 2, 1, 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 0, 7, 0, 7, - 2, 2, 2, 0, 0, 9, 1, 1, 0, 1, - 0, 6, 0, 6, 2, 1, 0, 8, 0, 9, - 0, 0, 10, 0, 0, 3, 0, 1, 1, 2, - 2, 0, 5, 0, 2, 2, 2, 1, 1, 1, - 0, 5, 0, 5, 1, 1, 2, 0, 0, 0, - 12, 0, 2, 2, 0, 1, 2, 1, 3, 2, - 0, 5, 0, 0, 0, 13, 0, 1, 1, 3, - 1, 4, 2, 0, 3, 2, 1, 3, 0, 3, - 1, 1, 3, 1, 2, 3, 4, 4, 0, 3, - 1, 3, 3, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, - 1, 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, - 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 3, 3, 4, 4, 4, 3, 3, 4, 3, - 4, 4, 0, 1, 3, 4, 0, 1, 1, 3, - 2, 3, 1, 2, 3, 2, 1, 1, 0, 1, - 1, 3, 3, 2, 2, 1, 1, 1, 1, 2, - 2, 4, 3, 1, 4, 4, 3, 1, 3, 2, - 1, 3, 1, 1, 1, 4, 3, 2, 2, 6, - 3, 7, 4, 3, 7, 3, 0, 2, 4, 1, - 2, 0, 1, 1, 3, 3, 1, 1, 1, 0, - 1, 1, 2, 2, 3, 1, 2, 0, 1, 2, - 4, 1, 3, 0, 5, 1, 1, 1, 2, 3, - 3, 4, 4, 1, 2, 4, 4, 4, 4, 0, - 4, 0, 5, 0, 1, 0, 4, 4, 1, 2, - 2, 4, 2, 1, 2, 2, 2, 2, 2, 2, - 1, 3, 3, 3, 1, 3, 3, 3, 3, 3, - 1, 3, 3, 1, 3, 3, 3, 3, 1, 3, - 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, - 3, 1, 3, 1, 5, 3, 3, 3, 3, 3, - 3, 3, 3, 3, 3, 3, 1, 3, 3, 2, - 1, 0, 1, 1, 1, 0, 2, 1, 1, 0, - 4, 0, 5, 0, 0, 7, 0, 0, 8, 1, - 1, 1, 1, 1, 1, 6, 4, 4, 1, 1, - 0, 0, 0, 0, 15, 0, 1, 0, 1, 1, - 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 0, 2, 3, 0, - 1, 1, 2, 4, 3, 1, 3, 1, 3, 1, - 1, 0, 1, 1, 1, 0, 4, 1, 1, 0, - 4, 1, 0, 1, 1, 2, 1, 1, 1, 2, + 2, 2, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 3, 3, 4, 4, 4, 3, 3, 4, + 3, 4, 4, 0, 1, 3, 4, 0, 1, 1, + 3, 2, 3, 1, 2, 3, 2, 1, 1, 0, + 1, 1, 3, 3, 3, 2, 1, 1, 1, 1, + 2, 2, 4, 3, 1, 4, 4, 3, 1, 3, + 2, 1, 3, 1, 1, 1, 4, 3, 2, 2, + 6, 3, 7, 4, 3, 7, 3, 0, 2, 4, + 1, 2, 0, 1, 1, 3, 3, 1, 1, 1, + 0, 1, 1, 2, 2, 3, 1, 2, 0, 1, + 2, 4, 1, 3, 0, 5, 1, 1, 1, 2, + 3, 3, 4, 4, 1, 2, 4, 4, 4, 4, + 0, 4, 0, 5, 0, 1, 0, 4, 4, 1, + 2, 2, 4, 2, 1, 2, 2, 2, 2, 2, + 2, 1, 3, 3, 3, 1, 3, 3, 3, 3, + 3, 1, 3, 3, 1, 3, 3, 3, 3, 1, + 3, 3, 1, 3, 1, 3, 1, 3, 1, 3, + 1, 3, 1, 3, 1, 5, 4, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 1, 3, + 3, 2, 1, 0, 1, 1, 1, 0, 2, 1, + 1, 0, 4, 0, 5, 0, 0, 7, 0, 0, + 8, 1, 1, 1, 1, 1, 1, 6, 4, 4, + 1, 1, 0, 0, 0, 0, 15, 0, 1, 0, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 0, 2, + 3, 0, 1, 1, 2, 4, 3, 1, 3, 1, + 3, 1, 1, 0, 1, 1, 1, 0, 4, 1, + 1, 0, 4, 1, 0, 1, 1, 2, 1, 1, + 1, 2, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 0, 4, 1, - 2, 2, 2, 2, 2, 2, 1, 1, 2, 1, - 1, 1, 0, 6, 0, 7, 1, 1, 0, 2, - 2, 1, 0, 1, 0, 1, 1, 2, 2, 4, - 0, 2, 0, 1, 1, 2, 4, 1, 5, 2, - 2, 2, 2, 2, 2, 1, 1, 1, 1, 1, - 5, 7, 4, 0, 8, 4, 0, 1, 1, 2, - 1, 0, 3, 1, 2, 3, 1, 1, 1, 1, - 1, 5, 4, 7, 3, 6, 0, 4, 0, 4, - 2, 0, 4, 2, 3, 1, 0, 1, 0, 5, - 1, 0, 1, 0, 1, 1, 1, 3, 4, 5, - 0, 9, 5, 4, 1, 1, 1, 1, 1, 1, - 2, 2, 3, 4, 3, 3, 3, 4, 3, 0, - 1, 3, 4, 5, 3, 1, 2, 0, 1, 2, - 0, 7, 3, 2, 2, 0, 3, 5, 4, 0, - 0, 10, 0, 0, 9, 5, 4, 2, 1, 0, - 2, 2, 2, 2, 2, 4, 5, 4, 5, 0, - 5, 0, 6, 3, 2, 1, 0, 3, 0, 0, - 6, 0, 1, 1, 2, 1, 1, 1, 1, 1, - 0, 5, 0, 3, 0, 0, 0, 12, 0, 0, - 0, 13, 0, 2, 0, 3, 1, 0, 4, 1, - 0, 4, 1, 2, 2, 1, 2, 2, 0, 0, - 4, 2, 3, 0, 4, 2, 2, 3, 0, 1, - 1, 1, 2, 2, 2, 4, 3, 0, 7, 4, - 4, 3, 1, 3, 0, 0, 4, 0, 1, 1, - 3, 2, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, + 4, 1, 2, 2, 2, 2, 2, 2, 1, 1, + 2, 1, 1, 1, 0, 6, 0, 7, 1, 1, + 0, 2, 2, 1, 0, 1, 0, 1, 1, 2, + 2, 4, 0, 2, 0, 1, 1, 2, 4, 1, + 5, 2, 2, 2, 2, 2, 2, 1, 1, 1, + 1, 1, 5, 7, 4, 0, 8, 4, 0, 1, + 1, 2, 1, 0, 3, 1, 2, 3, 3, 1, + 1, 1, 1, 1, 5, 4, 7, 3, 6, 0, + 4, 0, 4, 2, 0, 4, 2, 3, 1, 0, + 1, 0, 5, 1, 0, 1, 0, 1, 1, 1, + 3, 4, 5, 0, 9, 5, 4, 1, 1, 1, + 1, 1, 1, 2, 2, 2, 3, 4, 3, 3, + 2, 3, 2, 4, 3, 0, 1, 3, 4, 5, + 3, 1, 2, 0, 1, 2, 0, 7, 3, 2, + 2, 0, 3, 5, 4, 0, 0, 10, 0, 0, + 9, 5, 4, 2, 1, 0, 2, 2, 2, 2, + 2, 4, 5, 4, 5, 0, 5, 0, 6, 3, + 2, 2, 2, 1, 0, 3, 0, 0, 6, 1, + 2, 1, 1, 1, 1, 1, 0, 5, 0, 3, + 0, 0, 0, 12, 0, 0, 0, 13, 0, 2, + 0, 3, 1, 0, 4, 1, 0, 4, 1, 2, + 2, 1, 2, 2, 0, 0, 4, 2, 3, 0, + 4, 2, 2, 3, 0, 1, 1, 1, 2, 2, + 2, 4, 3, 0, 7, 4, 4, 3, 1, 3, + 0, 0, 4, 0, 1, 1, 3, 2, }; static readonly short [] yyDefRed = { 0, 8, 0, 0, 0, 0, 0, 0, 0, 2, 4, - 0, 0, 11, 14, 0, 942, 0, 0, 946, 0, - 0, 15, 17, 376, 382, 389, 377, 379, 0, 378, - 0, 385, 387, 374, 0, 381, 383, 375, 386, 388, - 384, 339, 963, 0, 380, 953, 0, 10, 1, 0, - 0, 0, 12, 0, 778, 0, 0, 0, 0, 0, - 0, 0, 0, 417, 0, 0, 0, 0, 0, 0, - 0, 415, 0, 0, 0, 475, 0, 416, 0, 514, - 0, 866, 0, 0, 0, 625, 0, 0, 0, 0, - 0, 0, 0, 676, 0, 727, 0, 0, 0, 0, - 0, 0, 0, 0, 414, 0, 614, 0, 777, 0, - 710, 0, 0, 0, 0, 391, 392, 0, 394, 395, - 396, 397, 398, 399, 400, 401, 402, 403, 404, 405, - 406, 407, 408, 409, 412, 413, 621, 544, 0, 0, + 0, 0, 11, 14, 0, 948, 0, 0, 952, 0, + 0, 15, 17, 377, 383, 390, 378, 380, 0, 379, + 0, 386, 388, 375, 0, 382, 384, 376, 387, 389, + 385, 340, 969, 0, 381, 959, 0, 10, 1, 0, + 0, 0, 12, 0, 780, 0, 0, 0, 0, 0, + 0, 0, 0, 418, 0, 0, 0, 0, 0, 0, + 0, 416, 0, 0, 0, 476, 0, 417, 0, 515, + 0, 872, 0, 0, 0, 627, 0, 0, 0, 0, + 0, 0, 0, 678, 0, 729, 0, 0, 0, 0, + 0, 0, 0, 0, 415, 0, 616, 0, 779, 0, + 712, 0, 0, 0, 0, 392, 393, 0, 395, 396, + 397, 398, 399, 400, 401, 402, 403, 404, 405, 406, + 407, 408, 409, 410, 413, 414, 623, 545, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 622, 620, 623, 624, 694, 696, 0, 692, 695, 711, - 713, 714, 715, 716, 717, 718, 719, 720, 721, 722, - 712, 0, 0, 0, 779, 780, 798, 799, 800, 801, - 835, 836, 837, 838, 839, 840, 0, 0, 0, 20, - 0, 0, 329, 0, 331, 950, 16, 943, 0, 0, - 240, 239, 236, 241, 242, 235, 254, 253, 246, 247, - 243, 245, 244, 248, 237, 238, 249, 250, 256, 255, - 251, 252, 0, 0, 966, 0, 955, 0, 954, 3, + 624, 622, 625, 626, 696, 698, 0, 694, 697, 713, + 715, 716, 717, 718, 719, 720, 721, 722, 723, 724, + 714, 0, 0, 0, 781, 782, 801, 802, 803, 804, + 838, 839, 840, 841, 842, 843, 0, 0, 0, 20, + 0, 0, 330, 0, 332, 956, 16, 949, 0, 0, + 241, 240, 237, 242, 243, 236, 255, 254, 247, 248, + 244, 246, 245, 249, 238, 239, 250, 251, 257, 256, + 252, 253, 0, 0, 972, 0, 961, 0, 960, 3, 51, 0, 0, 0, 40, 37, 39, 42, 43, 44, - 45, 46, 49, 13, 0, 0, 0, 841, 418, 419, - 864, 0, 0, 0, 0, 0, 0, 393, 0, 842, - 0, 536, 530, 535, 726, 776, 697, 724, 723, 725, - 698, 699, 700, 701, 702, 703, 704, 705, 706, 707, - 708, 709, 0, 0, 0, 807, 0, 0, 0, 742, - 741, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 851, 0, 390, 0, 0, 0, 0, 0, 0, - 865, 0, 0, 0, 740, 736, 0, 0, 0, 0, - 0, 0, 0, 358, 0, 0, 0, 0, 0, 0, - 0, 0, 617, 0, 543, 0, 0, 541, 545, 546, - 540, 550, 549, 547, 548, 610, 525, 0, 411, 410, - 0, 0, 0, 0, 0, 728, 0, 328, 0, 734, - 735, 0, 478, 479, 0, 0, 0, 732, 733, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 45, 46, 49, 13, 0, 0, 0, 844, 419, 420, + 870, 0, 0, 0, 0, 0, 0, 394, 0, 846, + 845, 0, 537, 531, 536, 728, 778, 699, 726, 725, + 727, 700, 701, 702, 703, 704, 705, 706, 707, 708, + 709, 710, 711, 0, 0, 0, 810, 0, 0, 0, + 744, 743, 0, 0, 0, 0, 0, 0, 0, 0, + 851, 0, 0, 857, 0, 391, 0, 0, 0, 853, + 0, 0, 0, 871, 0, 0, 0, 742, 738, 0, + 0, 0, 0, 0, 0, 0, 359, 0, 0, 0, + 0, 0, 0, 0, 0, 619, 0, 544, 0, 0, + 542, 546, 547, 541, 551, 550, 548, 549, 612, 526, + 0, 412, 411, 0, 0, 0, 0, 0, 730, 0, + 329, 0, 736, 737, 0, 479, 480, 0, 0, 0, + 734, 735, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 945, 693, 743, 731, 0, 774, 775, - 896, 913, 0, 0, 0, 925, 884, 882, 906, 0, - 0, 904, 907, 908, 909, 910, 885, 883, 0, 0, - 0, 333, 0, 18, 0, 0, 0, 962, 0, 340, - 0, 0, 0, 964, 0, 0, 38, 647, 653, 645, - 0, 642, 652, 646, 644, 643, 650, 648, 649, 655, - 651, 654, 656, 0, 0, 640, 41, 50, 477, 0, - 473, 474, 0, 0, 471, 0, 745, 0, 0, 0, - 805, 0, 773, 771, 772, 0, 0, 0, 629, 0, - 845, 843, 630, 0, 0, 499, 0, 0, 0, 490, - 0, 494, 504, 506, 0, 486, 0, 0, 0, 0, - 0, 481, 0, 484, 0, 488, 360, 846, 0, 0, - 847, 855, 0, 0, 0, 856, 0, 0, 867, 0, - 0, 739, 0, 370, 366, 367, 0, 0, 365, 368, - 369, 0, 0, 0, 551, 0, 0, 532, 0, 612, - 691, 0, 0, 0, 685, 687, 688, 689, 422, 423, - 0, 336, 337, 0, 178, 177, 179, 0, 0, 0, - 0, 362, 0, 597, 0, 0, 849, 0, 0, 427, - 0, 430, 0, 428, 0, 467, 0, 0, 0, 0, - 0, 456, 459, 0, 0, 451, 458, 457, 0, 586, - 587, 588, 589, 590, 591, 592, 593, 594, 596, 595, - 552, 554, 553, 559, 560, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 951, 695, 745, 733, + 0, 776, 777, 904, 919, 0, 0, 905, 907, 0, + 931, 890, 888, 912, 0, 0, 910, 913, 914, 915, + 916, 891, 889, 0, 0, 0, 334, 0, 18, 0, + 0, 0, 968, 0, 341, 0, 0, 0, 970, 0, + 0, 38, 649, 655, 647, 0, 644, 654, 648, 646, + 645, 652, 650, 651, 657, 653, 656, 658, 0, 0, + 642, 41, 50, 478, 0, 474, 475, 0, 0, 472, + 0, 747, 0, 0, 0, 808, 0, 775, 773, 774, + 0, 0, 0, 631, 0, 849, 847, 632, 0, 0, + 500, 0, 0, 0, 491, 0, 495, 505, 507, 0, + 487, 0, 0, 0, 0, 0, 482, 0, 485, 0, + 489, 361, 850, 0, 0, 852, 861, 0, 0, 0, + 862, 0, 0, 873, 0, 0, 741, 0, 371, 367, + 368, 0, 0, 366, 369, 370, 0, 0, 0, 552, + 0, 0, 533, 0, 614, 693, 0, 0, 0, 687, + 689, 690, 691, 423, 424, 0, 337, 338, 0, 179, + 178, 180, 0, 0, 0, 0, 363, 0, 599, 0, + 0, 855, 0, 0, 428, 0, 431, 0, 429, 0, + 468, 0, 0, 0, 0, 0, 457, 460, 0, 0, + 452, 459, 458, 0, 588, 589, 590, 591, 592, 593, + 594, 595, 596, 598, 597, 553, 555, 554, 560, 561, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 583, 0, 0, 503, 0, 0, 0, 0, 0, 0, - 0, 897, 899, 895, 0, 905, 0, 0, 330, 960, - 961, 354, 0, 0, 0, 351, 0, 0, 175, 0, - 0, 970, 956, 958, 59, 57, 58, 0, 0, 52, - 0, 0, 60, 62, 26, 24, 0, 0, 0, 637, - 0, 641, 426, 0, 476, 0, 527, 0, 538, 165, - 186, 0, 0, 155, 0, 0, 0, 166, 531, 0, - 870, 0, 827, 808, 0, 818, 0, 829, 0, 844, - 783, 0, 869, 0, 0, 489, 0, 505, 507, 0, - 0, 443, 0, 0, 439, 0, 0, 468, 0, 509, - 483, 0, 140, 510, 138, 139, 512, 0, 526, 786, - 0, 860, 0, 853, 0, 857, 518, 0, 0, 0, - 355, 0, 516, 0, 0, 528, 877, 0, 873, 803, - 0, 888, 0, 886, 0, 0, 627, 628, 0, 0, - 0, 690, 678, 679, 677, 686, 605, 611, 604, 0, - 0, 335, 600, 0, 0, 0, 542, 848, 729, 431, - 425, 429, 424, 529, 466, 465, 464, 461, 460, 0, - 455, 420, 421, 432, 0, 0, 752, 0, 0, 609, - 608, 914, 890, 0, 915, 0, 911, 0, 926, 0, - 0, 0, 0, 894, 19, 332, 675, 674, 0, 673, - 0, 350, 972, 176, 967, 0, 0, 53, 0, 0, - 0, 0, 0, 0, 357, 0, 631, 0, 0, 79, - 78, 0, 472, 0, 0, 0, 0, 0, 537, 0, - 0, 0, 0, 0, 819, 811, 809, 0, 830, 0, - 0, 868, 496, 495, 446, 0, 0, 951, 952, 435, - 441, 0, 444, 0, 470, 0, 0, 0, 0, 0, - 784, 863, 0, 854, 0, 524, 519, 0, 0, 515, - 0, 876, 0, 802, 889, 887, 0, 533, 0, 613, - 607, 338, 599, 598, 615, 463, 0, 453, 452, 585, - 140, 0, 768, 750, 0, 0, 0, 757, 0, 892, - 0, 919, 0, 934, 935, 928, 898, 900, 940, 353, - 352, 971, 0, 0, 61, 55, 0, 63, 25, 22, - 0, 0, 308, 0, 212, 0, 102, 0, 76, 762, - 113, 114, 0, 0, 0, 765, 184, 185, 0, 0, - 0, 0, 158, 167, 159, 161, 806, 0, 0, 0, - 0, 0, 828, 0, 0, 445, 447, 448, 442, 436, - 440, 0, 501, 0, 469, 480, 434, 513, 511, 0, - 859, 0, 0, 0, 520, 0, 879, 0, 0, 626, - 618, 0, 462, 0, 0, 748, 747, 744, 758, 891, - 0, 0, 0, 912, 0, 0, 0, 959, 0, 0, - 0, 68, 69, 72, 73, 0, 323, 314, 313, 0, - 632, 208, 97, 0, 746, 766, 170, 0, 182, 0, - 0, 0, 804, 881, 0, 0, 0, 823, 810, 0, - 831, 782, 485, 482, 791, 0, 797, 0, 0, 789, - 0, 794, 861, 523, 522, 878, 874, 0, 616, 0, - 0, 893, 916, 0, 0, 0, 930, 0, 941, 0, - 74, 66, 0, 0, 0, 309, 0, 0, 0, 0, - 0, 171, 0, 162, 160, 871, 820, 814, 812, 0, - 0, 785, 790, 0, 795, 0, 0, 619, 0, 760, - 0, 920, 937, 938, 931, 901, 54, 0, 70, 71, - 0, 0, 0, 0, 0, 0, 0, 767, 169, 0, - 181, 0, 0, 832, 796, 0, 680, 682, 862, 875, - 769, 0, 0, 0, 75, 0, 0, 324, 0, 310, - 0, 318, 373, 0, 371, 0, 633, 0, 662, 209, - 98, 172, 872, 816, 813, 0, 0, 825, 0, 917, - 0, 932, 0, 0, 0, 0, 0, 659, 0, 0, - 0, 663, 0, 0, 0, 0, 0, 921, 28, 23, - 325, 0, 0, 319, 372, 665, 0, 0, 0, 99, - 815, 681, 0, 0, 0, 0, 311, 670, 0, 671, - 668, 0, 666, 95, 0, 0, 93, 0, 0, 82, + 0, 0, 0, 0, 0, 584, 0, 0, 504, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 903, 902, + 0, 911, 0, 901, 0, 0, 331, 966, 967, 355, + 0, 0, 0, 352, 0, 0, 176, 0, 0, 976, + 962, 964, 59, 57, 58, 0, 0, 52, 0, 0, + 60, 62, 26, 24, 0, 0, 0, 639, 0, 643, + 427, 0, 477, 0, 528, 0, 539, 165, 187, 0, + 0, 0, 155, 0, 0, 0, 166, 532, 0, 876, + 0, 830, 811, 0, 821, 0, 832, 0, 848, 785, + 0, 875, 0, 0, 490, 0, 506, 508, 0, 0, + 444, 0, 0, 440, 0, 0, 469, 0, 510, 484, + 0, 140, 511, 138, 139, 513, 0, 527, 788, 0, + 866, 0, 859, 0, 863, 519, 0, 0, 0, 356, + 0, 517, 0, 0, 529, 883, 0, 879, 806, 0, + 894, 0, 892, 0, 0, 629, 630, 0, 0, 0, + 692, 680, 681, 679, 688, 607, 613, 606, 0, 0, + 336, 602, 0, 0, 0, 543, 854, 731, 432, 426, + 430, 425, 530, 467, 466, 465, 462, 461, 0, 456, + 421, 422, 433, 0, 587, 0, 754, 0, 0, 611, + 610, 920, 896, 0, 921, 0, 906, 908, 917, 0, + 932, 0, 900, 946, 19, 333, 677, 676, 0, 675, + 0, 351, 978, 177, 973, 0, 0, 53, 0, 0, + 0, 0, 0, 0, 358, 0, 633, 0, 0, 79, + 78, 0, 473, 0, 0, 0, 0, 0, 170, 538, + 0, 0, 0, 0, 0, 822, 814, 812, 0, 833, + 0, 0, 874, 497, 496, 447, 0, 0, 957, 958, + 436, 442, 0, 445, 0, 471, 0, 0, 0, 0, + 0, 786, 869, 0, 860, 0, 525, 520, 0, 0, + 516, 0, 882, 0, 805, 895, 893, 0, 534, 0, + 615, 609, 339, 601, 600, 617, 464, 0, 455, 454, + 453, 586, 140, 0, 770, 752, 0, 0, 0, 759, + 0, 898, 0, 925, 0, 0, 940, 941, 934, 0, + 354, 353, 977, 0, 0, 61, 55, 0, 63, 25, + 22, 0, 0, 309, 0, 213, 0, 102, 0, 76, + 764, 113, 114, 0, 0, 0, 767, 185, 186, 0, + 0, 0, 0, 158, 167, 159, 161, 809, 0, 0, + 0, 0, 0, 831, 0, 0, 446, 448, 449, 443, + 437, 441, 0, 502, 0, 470, 481, 435, 514, 512, + 0, 865, 0, 0, 0, 521, 0, 885, 0, 0, + 628, 620, 0, 463, 0, 0, 750, 749, 746, 760, + 897, 0, 0, 0, 0, 918, 0, 947, 965, 0, + 0, 0, 68, 69, 72, 73, 0, 324, 315, 314, + 0, 634, 209, 97, 0, 748, 768, 171, 0, 183, + 0, 0, 0, 807, 887, 0, 0, 0, 0, 813, + 0, 834, 784, 486, 483, 793, 0, 800, 0, 0, + 791, 0, 796, 867, 524, 523, 884, 880, 0, 618, + 0, 0, 899, 922, 0, 909, 0, 0, 936, 0, + 74, 66, 0, 0, 0, 310, 0, 0, 0, 0, + 0, 172, 0, 162, 160, 877, 823, 817, 815, 0, + 0, 787, 792, 0, 797, 0, 0, 621, 0, 762, + 0, 926, 943, 944, 937, 54, 0, 70, 71, 0, + 0, 0, 0, 0, 0, 0, 769, 169, 0, 182, + 0, 0, 835, 799, 798, 0, 682, 684, 868, 881, + 771, 0, 0, 0, 75, 0, 0, 325, 0, 311, + 0, 319, 374, 0, 372, 0, 635, 0, 664, 210, + 98, 173, 878, 819, 816, 0, 0, 828, 0, 923, + 0, 938, 0, 0, 0, 0, 0, 661, 0, 0, + 0, 665, 0, 0, 0, 0, 0, 927, 28, 23, + 326, 0, 0, 320, 373, 667, 0, 0, 0, 99, + 818, 683, 0, 0, 0, 0, 312, 672, 0, 673, + 670, 0, 668, 95, 0, 0, 93, 0, 0, 82, 84, 85, 86, 87, 88, 89, 90, 91, 92, 94, - 141, 0, 0, 225, 217, 218, 219, 220, 221, 222, - 223, 224, 0, 0, 215, 0, 0, 918, 0, 326, - 322, 0, 0, 0, 307, 634, 83, 0, 268, 263, - 267, 0, 210, 216, 0, 924, 922, 669, 667, 0, - 0, 0, 0, 0, 0, 0, 277, 0, 0, 226, - 0, 0, 234, 0, 153, 142, 152, 0, 100, 0, - 0, 262, 0, 0, 261, 0, 146, 0, 0, 344, - 0, 342, 0, 0, 187, 0, 0, 0, 0, 0, - 635, 211, 0, 103, 0, 341, 0, 0, 0, 0, + 141, 0, 0, 226, 218, 219, 220, 221, 222, 223, + 224, 225, 0, 0, 216, 0, 0, 924, 0, 327, + 323, 0, 0, 0, 308, 636, 83, 0, 269, 264, + 268, 0, 211, 217, 0, 930, 928, 671, 669, 0, + 0, 0, 0, 0, 0, 0, 278, 0, 0, 227, + 0, 0, 235, 0, 153, 142, 152, 0, 100, 0, + 0, 263, 0, 0, 262, 0, 146, 0, 0, 345, + 0, 343, 0, 0, 188, 0, 0, 0, 0, 0, + 637, 212, 0, 103, 0, 342, 0, 0, 0, 0, 117, 0, 0, 0, 0, 0, 0, 151, 143, 0, - 0, 191, 0, 345, 0, 229, 228, 227, 0, 101, - 0, 281, 0, 259, 119, 0, 257, 0, 0, 0, - 121, 0, 346, 0, 0, 188, 0, 0, 0, 343, - 232, 112, 110, 0, 0, 285, 0, 0, 0, 0, - 0, 147, 0, 265, 0, 0, 0, 0, 125, 0, - 0, 0, 0, 347, 348, 0, 0, 0, 0, 0, - 107, 300, 0, 282, 0, 0, 294, 0, 0, 0, - 289, 0, 137, 0, 0, 0, 0, 132, 0, 0, - 278, 0, 122, 0, 116, 126, 144, 150, 199, 0, - 189, 0, 0, 0, 0, 111, 0, 104, 108, 0, - 0, 0, 296, 0, 297, 286, 0, 0, 280, 290, - 260, 0, 0, 118, 133, 258, 0, 276, 0, 266, - 270, 128, 0, 0, 0, 196, 198, 192, 233, 109, - 301, 303, 283, 0, 0, 295, 292, 136, 134, 148, - 275, 0, 0, 0, 145, 200, 202, 190, 0, 0, - 0, 294, 0, 271, 273, 129, 0, 0, 193, 305, - 306, 302, 304, 293, 149, 0, 0, 206, 205, 204, - 201, 203, 0, 0, 0, 194, 272, 274, + 0, 192, 0, 346, 0, 230, 229, 228, 0, 101, + 0, 282, 0, 260, 119, 0, 258, 0, 0, 0, + 121, 0, 347, 0, 0, 189, 0, 0, 0, 344, + 233, 112, 110, 0, 0, 286, 0, 0, 0, 0, + 0, 147, 0, 266, 0, 0, 0, 0, 125, 0, + 0, 0, 0, 348, 349, 0, 0, 0, 0, 0, + 107, 301, 0, 283, 0, 0, 295, 0, 0, 0, + 290, 0, 137, 0, 0, 0, 0, 132, 0, 0, + 279, 0, 122, 0, 116, 126, 144, 150, 200, 0, + 190, 0, 0, 0, 0, 111, 0, 104, 108, 0, + 0, 0, 297, 0, 298, 287, 0, 0, 281, 291, + 261, 0, 0, 118, 133, 259, 0, 277, 0, 267, + 271, 128, 0, 0, 0, 197, 199, 193, 234, 109, + 302, 304, 284, 0, 0, 296, 293, 136, 134, 148, + 276, 0, 0, 0, 145, 201, 203, 191, 0, 0, + 0, 295, 0, 272, 274, 129, 0, 0, 194, 306, + 307, 303, 305, 294, 149, 0, 0, 207, 206, 205, + 202, 204, 0, 0, 0, 195, 273, 275, }; protected static readonly short [] yyDgoto = { 7, - 8, 49, 9, 50, 10, 11, 51, 232, 692, 654, - 12, 13, 52, 22, 23, 321, 235, 677, 843, 1036, - 1157, 1500, 840, 236, 237, 238, 239, 240, 241, 242, - 243, 670, 445, 671, 672, 944, 673, 674, 948, 841, - 1031, 1032, 1033, 266, 593, 1128, 110, 852, 1228, 1229, - 1230, 1231, 1232, 1233, 1234, 1235, 1236, 1237, 1238, 1239, - 1240, 464, 681, 1312, 958, 1135, 1099, 1167, 1194, 1256, - 1323, 1163, 1374, 1351, 1399, 1400, 1401, 960, 1397, 961, - 736, 1289, 1362, 1336, 1387, 516, 1380, 1356, 1416, 923, - 1385, 1388, 1389, 1484, 1417, 1418, 1414, 1241, 1296, 1268, - 1313, 693, 1364, 1463, 1333, 1420, 1493, 465, 267, 694, - 695, 696, 697, 698, 657, 570, 1140, 658, 659, 858, - 1315, 1341, 1431, 1392, 1465, 1316, 1367, 1489, 1513, 1432, - 1433, 1511, 1497, 1498, 956, 1098, 1193, 1253, 1298, 1254, - 1255, 1290, 1348, 1319, 1291, 324, 223, 1396, 1293, 1381, - 1378, 1242, 1270, 1309, 1460, 1422, 1149, 1461, 594, 1506, - 1507, 1308, 1377, 1353, 1409, 1404, 1375, 1441, 1446, 1407, - 1410, 1411, 1492, 1447, 1405, 1406, 1502, 1490, 1491, 953, - 1040, 1160, 1133, 1186, 1161, 1162, 1202, 1095, 1184, 1215, - 535, 193, 112, 350, 195, 564, 440, 224, 1328, 655, - 656, 829, 845, 325, 407, 534, 303, 1164, 1165, 45, - 114, 304, 116, 117, 118, 119, 120, 121, 122, 123, + 8, 49, 9, 50, 10, 11, 51, 232, 700, 662, + 12, 13, 52, 22, 23, 324, 235, 685, 853, 1047, + 1167, 1510, 850, 236, 237, 238, 239, 240, 241, 242, + 243, 678, 450, 679, 680, 955, 681, 682, 959, 851, + 1042, 1043, 1044, 267, 598, 1137, 110, 862, 1238, 1239, + 1240, 1241, 1242, 1243, 1244, 1245, 1246, 1247, 1248, 1249, + 1250, 469, 689, 1322, 969, 1144, 1109, 1177, 1204, 1266, + 1333, 1173, 1384, 1361, 1409, 1410, 1411, 971, 1407, 972, + 745, 1299, 1372, 1346, 1397, 521, 1390, 1366, 1426, 935, + 1395, 1398, 1399, 1494, 1427, 1428, 1424, 1251, 1306, 1278, + 1323, 702, 1374, 1473, 1343, 1430, 1503, 470, 268, 703, + 704, 705, 706, 707, 665, 575, 1149, 666, 667, 868, + 1325, 1351, 1441, 1402, 1475, 1326, 1377, 1499, 1523, 1442, + 1443, 1521, 1507, 1508, 967, 1108, 1203, 1263, 1308, 1264, + 1265, 1300, 1358, 1329, 1301, 327, 223, 1406, 1303, 1391, + 1388, 1252, 1280, 1319, 1470, 1432, 1159, 1471, 599, 1516, + 1517, 1318, 1387, 1363, 1419, 1414, 1385, 1451, 1456, 1417, + 1420, 1421, 1502, 1457, 1415, 1416, 1512, 1500, 1501, 964, + 1051, 1170, 1142, 1196, 1171, 1172, 1212, 1105, 1194, 1225, + 540, 193, 112, 353, 195, 569, 445, 224, 1338, 663, + 664, 839, 855, 328, 410, 539, 305, 1174, 1175, 45, + 114, 306, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, - 134, 135, 136, 252, 804, 996, 512, 723, 880, 724, - 725, 989, 137, 198, 729, 595, 596, 597, 598, 798, - 474, 475, 297, 994, 731, 408, 299, 499, 500, 501, - 502, 505, 738, 310, 754, 755, 897, 263, 480, 769, - 264, 479, 138, 139, 140, 141, 142, 143, 144, 145, - 146, 147, 148, 149, 150, 151, 812, 152, 573, 574, - 575, 778, 779, 780, 153, 561, 771, 351, 1012, 549, - 1078, 154, 494, 954, 1097, 1191, 1294, 466, 1168, 1169, - 1222, 1223, 830, 553, 336, 775, 1179, 554, 555, 268, - 269, 270, 157, 158, 159, 271, 272, 273, 274, 275, - 276, 277, 278, 279, 280, 281, 282, 171, 283, 579, - 172, 173, 317, 809, 633, 926, 1018, 855, 688, 964, - 924, 927, 1056, 928, 965, 966, 284, 174, 175, 176, - 1068, 1000, 1069, 1070, 1071, 1114, 1072, 177, 178, 179, - 180, 704, 487, 705, 1059, 982, 1060, 1175, 1143, 1176, - 706, 981, 707, 1178, 1110, 181, 182, 183, 184, 185, - 186, 305, 525, 526, 1002, 1116, 313, 980, 864, 1142, - 1009, 903, 1117, 187, 418, 188, 419, 929, 1021, 420, - 645, 824, 821, 822, 1026, 421, 422, 423, 424, 425, - 426, 933, 635, 931, 1121, 1197, 1258, 1023, 1153, 1214, - 819, 641, 820, 1086, 1025, 1087, 1154, 1027, 17, 19, - 46, 47, 227, 660, 837, 441, 661, 662, + 134, 135, 136, 252, 813, 1007, 517, 732, 891, 733, + 734, 1000, 137, 198, 738, 600, 601, 602, 603, 807, + 479, 480, 298, 1005, 740, 411, 300, 504, 505, 506, + 507, 510, 747, 313, 763, 764, 908, 264, 485, 778, + 265, 484, 138, 139, 140, 141, 142, 143, 144, 145, + 146, 147, 148, 149, 150, 151, 822, 152, 578, 579, + 580, 787, 788, 789, 153, 566, 780, 354, 1023, 554, + 1089, 154, 499, 965, 1107, 1201, 1304, 471, 1178, 1179, + 1232, 1233, 840, 558, 339, 784, 1189, 559, 560, 269, + 270, 271, 157, 158, 159, 272, 273, 274, 275, 276, + 277, 278, 279, 280, 281, 282, 283, 171, 284, 584, + 172, 173, 320, 819, 638, 938, 1029, 865, 696, 975, + 936, 939, 1067, 940, 976, 977, 285, 174, 175, 176, + 1079, 1011, 1080, 1081, 1082, 1124, 1083, 177, 178, 179, + 180, 713, 492, 714, 1070, 993, 1071, 1185, 1152, 1186, + 715, 992, 716, 1188, 1120, 181, 182, 183, 184, 185, + 186, 307, 530, 531, 1013, 1126, 316, 991, 875, 1151, + 1020, 914, 1127, 187, 423, 188, 424, 941, 1032, 425, + 426, 654, 645, 646, 945, 427, 428, 429, 430, 431, + 946, 640, 943, 1131, 1207, 1268, 1034, 1163, 1224, 831, + 648, 832, 1098, 1037, 1099, 1164, 950, 17, 19, 46, + 47, 227, 668, 847, 446, 669, 670, }; - protected static readonly short [] yySindex = { -186, - 0, -219, -146, 10, 77, 4746, 0, 13, 0, 0, - 77, 10, 0, 0, -114, 0, 6722, 77, 0, -208, - -233, 0, 0, 0, 0, 0, 0, 0, -91, 0, - 71, 0, 0, 0, 1653, 0, 0, 0, 0, 0, - 0, 0, 0, 391, 0, 0, 664, 0, 0, 13, - 75, 77, 0, 162, 0, 308, 236, 330,11679, 446, - -246, 176, 6879, 0, -246, -246, -246, -163, -246, -246, - 564, 0,10782, -246, -246, 0,10782, 0, 465, 0, - 330, 0, -246, 400, -246, 0,12152,12152, 471, -246, - -246, -215,11462, 0,10782, 0,11462,11462,11462,11462, -11462,11462,11462,11462, 0, 276, 0, 8428, 0, 149, - 0, 443, 387, 1034, 338, 0, 0, 490, 0, 0, + protected static readonly short [] yySindex = { -175, + 0, -180, -100, -38, 249,12550, 0, 124, 0, 0, + 249, -38, 0, 0, 200, 0, 6884, 249, 0, -171, + -242, 0, 0, 0, 0, 0, 0, 0, 319, 0, + 397, 0, 0, 0, 3907, 0, 0, 0, 0, 0, + 0, 0, 0, 289, 0, 0, 712, 0, 0, 124, + 367, 249, 0, 374, 0, 214, 401, 244,12032, -83, + -255, 420, 7041, 0, -255, -255, -255, -90, -255, -255, + 720, 0, 8730, -255, -255, 0, 8887, 0, 429, 0, + 244, 0, -255, 458, -255, 0,12594,12594, 491, -255, + -255, -191,11815, 0,11135, 0,11815,11815,11815,11815, +11815,11815,11815,11815, 0, 258, 0, 8590, 0, 218, + 0, 468, 11, 522, 387, 0, 0, 527, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 1360, 788, - 148, 524, 527, 621, 507, 516, 593, 612, 415, 610, - 0, 0, 0, 0, 0, 0, 3318, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 1299, 685, + 89, -273, -265, 413, 529, 561, 553, 557, 123, 588, + 0, 0, 0, 0, 0, 0, 3608, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 223, 665, -242, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, -192, -175, 75, 0, - 361, 234, 0, 630, 0, 0, 0, 0, 8428, 8428, + 0, -8, 617, -261, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 306, 330, 367, 0, + 403, 344, 0, 577, 0, 0, 0, 0, 8590, 8590, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 689, 652, 0, 682, 0, -210, 0, 0, - 0, 75,12778, 826, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 859, 687,10918, 0, 0, 0, - 0,10782, -246, -246, 797, 194, 1034, 0, 223, 0, - 8428, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 651, 612, 0, 616, 0, -248, 0, 0, + 0, 367,13162, 470, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 788, 661,11271, 0, 0, 0, + 0,11135, -255, -255, 781, 412, 522, 0, -8, 0, + 0, 8590, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, -152, 175,11679, 0, 8428,10782, 713, 0, - 0, 757,10782,10782, 9039, 639, -204, 773, 8585,11462, - 276, 0, 772, 0, 780, 8428,10782, 783, 562, -246, - 0,10782, 465,10238, 0, 0, 400,10782, 400, 411, - 470, 871, 223, 0, 665, 338, 884, 223,10782,10782, -10782, 176, 0, 862, 0, 7036, -54, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 4201, 0, 0, -12108, 411, 841, 843,10782, 0, 801, 0, 48, 0, - 0, 294, 0, 0, 813, 8411, 9966, 0, 0,11462, -10782,10782,10782,10782,10782,10782,10782,10782,10782,10782, -10782,11462,11462,11462, 8428, 8428,11462,11462,11462,11462, -11462,11462,11462,11462,11462,11462,11462,11462,11462,11462, -11462,11462,10782, 0, 0, 0, 0, 665, 0, 0, - 0, 0,12152,12152, 223, 0, 0, 0, 0, 54, - 645, 0, 0, 0, 0, 0, 0, 0, 75, 826, - 820, 0, 834, 0, 801, 689, 689, 0, -121, 0, - 602, 689, 867, 0, -184,12778, 0, 0, 0, 0, - -203, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 200,12808, 0, 0, 0, 0, 801, - 0, 0, 879, 673, 0, 889, 0, 894, 38, 465, - 0, -246, 0, 0, 0, 223,10238, -212, 0, 880, - 0, 0, 0, -103, -61, 0, 419, 0, 901, 0, - 899, 0, 0, 0, 699, 0, 8095, 720,10782, 773, - 9966, 0, 7507, 0, 400, 0, 0, 0, 904, 87, - 0, 0, 330, 465, 193, 0, 4042, 906, 0, 110, - 223, 0, 118, 0, 0, 0,10782, 986, 0, 0, - 0,10782, 988, 915, 0, 922, 927, 0,12108, 0, - 0, -197, 59, 7036, 0, 0, 0, 0, 0, 0, - 465, 0, 0, -235, 0, 0, 0, 400, 411, 223, - 8742, 0, 926, 0, 931,11462, 0, 928, 7036, 0, - 367, 0, 410, 0, 801, 0, -71,10782,10782, 934, - 1051, 0, 0, -31, 936, 0, 0, 0, 788, 0, + 0, 0, 0, -146, 138,12032, 0, 8590,11135, 740, + 0, 0, 750,11135,11135, 4875, 157, -165, 764, 8747, + 0,11815, 258, 0, 762, 0, 789, 8590,11135, 0, + 826, 442, -255, 0,11135, 429,10591, 0, 0, 458, +11135, 458, 228, 443, 848, -8, 0, 617, 387, 851, + -8,11135,11135,11135, 420, 0, 818, 0, 7198, -50, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 788, 788, 148, 148, 524, - 524, 524, 524, 527, 527, 621, 507, 516, 593, 612, - 0, 945, -202, 0, 8568, 1015, 223, 1017, 223, 940, -10782, 0, 0, 0, 966, 0, 292, 801, 0, 0, - 0, 0, 591, 75, -64, 0, 8742, 602, 0, 951, - 952, 0, 0, 0, 0, 0, 0, 411, 954, 0, - 953, 957, 0, 0, 0, 0, 959, 8899, 916, 0, - 355, 0, 0, 638, 0,10918, 0, 955, 0, 0, - 0, 567, 961, 0, 964, 965, 967, 0, 0,10782, - 0, 223, 0, 0, 408, 0, 970, 0, -144, 0, - 0, 6879, 0, 6879, 8254, 0, 9039, 0, 0,10374, - 301, 0, 104, -83, 0, 911, 912, 0, 26, 0, - 0, 976, 0, 0, 0, 0, 0, 979, 0, 0, - 987, 0, 7524, 0, 465, 0, 0, 400, 514, 937, - 0, 228, 0, 983, 989, 0, 0, 6879, 0, 0, - 6879, 0,10782, 0,10782, 8428, 0, 0, 465, 984, - 465, 0, 0, 0, 0, 0, 0, 0, 0, 8568, - 8428, 0, 0, 223,12108, 1020, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 9830, - 0, 0, 0, 0,10102, 8568, 0, 7664, 992, 0, - 0, 0, 0, 1073, 0, 1077, 0, 847, 0, 998, - 8568, 8568, 223, 0, 0, 0, 0, 0, 956, 0, - -121, 0, 0, 0, 0, 602, 602, 0, 820, 1005, - 1006, 963, 1012, 916, 0, 1007, 0, 1127, 1128, 0, - 0,10782, 0,10510, 1014, 567, 8742, 8428, 0, 347, - 1134, 1135, 121, 1022, 0, 0, 0,10782, 0,10782, - 1113, 0, 0, 0, 0, 155,10646, 0, 0, 0, - 0, 7800, 0, 1140, 0, 665,10782, 1031, 8254, 1033, - 0, 0, 223, 0, 232, 0, 0, 801, 937, 0, - 223, 0, -160, 0, 0, 0, 1032, 0, 1063, 0, - 0, 0, 0, 0, 0, 0, 705, 0, 0, 0, - 0, 8585, 0, 0, 223, -231, 992, 0, 8568, 0, - 8568, 0, 8568, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 1041, 820, 0, 0,11054, 0, 0, 0, - 1039, 7681, 0, 916, 0, 916, 0, 916, 0, 0, - 0, 0, 223, 1036, 1014, 0, 0, 0, -193, -191, - 1044, 1046, 0, 0, 0, 0, 0, 1045, 8254, 992, - -202,10782, 0, 1043, 6879, 0, 0, 0, 0, 0, - 0, 1052, 0, 773, 0, 0, 0, 0, 0, -179, - 0, 1056, 801, 937, 0, 937, 0, 992, 1057, 0, - 0, 465, 0, 1000, 1053, 0, 0, 0, 0, 0, - 8568, 1085, 8568, 0,10782, 1084, 318, 0, 957, 329, - 734, 0, 0, 0, 0, 10, 0, 0, 0, 1071, - 0, 0, 0, 1059, 0, 0, 0, 340, 0, 1064, - 1168, 1193, 0, 0, 992, 1075, 992, 0, 0, 560, - 0, 0, 0, 0, 0,10782, 0, 1083, -217, 0, - -217, 0, 0, 0, 0, 0, 0, 465, 0,10782, - 7959, 0, 0, 1108, 887, 1082, 0, 8568, 0, 1089, - 0, 0,11054, 77, 38, 0, 1087, 1087, 1087,10510, - 1090, 0,10782, 0, 0, 0, 0, 0, 0, 6879, - 1091, 0, 0, 7036, 0, 686, 6879, 0, 1094, 0, - 8568, 0, 0, 0, 0, 0, 0,10782, 0, 0, - 75, 1093, 75, 8428, 1131, 1131, 1131, 0, 0,10782, - 0, 6879, 8725, 0, 0, 7036, 0, 0, 0, 0, - 0, 1123, 8568,10782, 0, 75, 1105, 0, 1061, 0, - 1100, 0, 0, -65, 0, 1062, 0, 1131, 0, 0, - 0, 0, 0, 0, 0, 1109, 970, 0, 7036, 0, - 1138, 0, 1106, 1131, 0, 1115, 75, 0, 8428, -149, - 1124, 0, 1129, 1130, 6879, 1126, 8568, 0, 0, 0, - 0, 1114, 1106, 0, 0, 0,11758, 76, 75, 0, - 0, 0, 1148, 8568, 1141,10782, 0, 0, 1136, 0, - 0, 1132, 0, 0,12808, 877, 0, 1137, 76, 0, + 4491, 0, 0,12505, 228, 804, 827,11135, 0, 791, + 0, -298, 0, 0, 441, 0, 0, 786, 9044,10455, + 0, 0,11815,11135,11135,11135,11135,11135,11135,11135, +11135,11135,11135,11135,11815,11815,11815, 8590, 8590,11815, +11815,11815,11815,11815,11815,11815,11815,11815,11815,11815, +11815,11815,11815,11815,11815,11135, 0, 0, 0, 0, + 617, 0, 0, 0, 0,12594,12594, 0, 0, -8, + 0, 0, 0, 0, 469, 850, 0, 0, 0, 0, + 0, 0, 0, 367, 470, 792, 0, 795, 0, 791, + 651, 651, 0, 71, 0, 559, 651, 839, 0, -195, +13162, 0, 0, 0, 0, -164, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 202,13194, + 0, 0, 0, 0, 791, 0, 0, 837, 586, 0, + 842, 0, 847, 59, 429, 0, -255, 0, 0, 0, + -8,10591, -184, 0, 844, 0, 0, 0, -174, 58, + 0, 423, 0, 858, 0, 853, 0, 0, 0, 607, + 0, 8414, 618,11135, 764,10455, 0, 7669, 0, 458, + 0, 0, 0, 856, 63, 0, 0, 244, 429, 516, + 0, 4332, 859, 0, 65, -8, 0, 94, 0, 0, + 0,11135, 936, 0, 0, 0,11135, 939, 860, 0, + 863, 865, 0,12505, 0, 0, -182, -28, 7198, 0, + 0, 0, 0, 0, 0, 429, 0, 0, 6, 0, + 0, 0, 458, 228, -8, 8904, 0, 864, 0, 870, +11815, 0, 867, 7198, 0, -289, 0, 304, 0, 791, + 0, -65,11135,11135, 873, 992, 0, 0, -47, 883, + 0, 0, 0, 685, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 558,12808, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 1143, 75, 0, 76, 223, 0, 1148, 0, - 0, 1149,11758,11924, 0, 0, 0, 119, 0, 0, - 0,11956, 0, 0, 1152, 0, 0, 0, 0, 8428, - 8428, 125, 8585, 320, 400, 1186, 0, 411, 1238, 0, - 1220, 0, 0, 1106, 0, 0, 0, 1106, 0, 1110, - 1112, 0, 8428, -176, 0, 8428, 0, 1116, 1155, 0, - 411, 0, -63, 4356, 0, 1162, 1118, -27, 238, 1653, - 0, 0, 1106, 0, 411, 0, 1165, 1125, 1170, 1166, - 0, 1175, 1112, 1180, 38, 1171, 1181, 0, 0, 1185, - 1194, 0, 801, 0, 833, 0, 0, 0, 1187, 0, - -128, 0, 1183, 0, 0, 1197, 0, 1196, 1190, 1198, - 0, 1195, 0, 38, 38, 0, 38, 1199, 1200, 0, - 0, 0, 0, 1201, 83, 0, 1203, 38, 1322, 1205, - 38, 0, 119, 0, 8254, 1163, 1204, 1195, 0, 1210, - 1211, 92, 1214, 0, 0, 38,10510, 1169, 1212, 1201, - 0, 0,12808, 0, 75, 75, 0, 1172, 1213, 1203, - 0, 1219, 0,10782, 1177, 1217, 1205, 0, 1229, 38, - 0, -142, 0, 1237, 0, 0, 0, 0, 0,12808, - 0, 92, 92, 1252, 1248, 0, -128, 0, 0, -153, - 1253,12808, 0,12808, 0, 0, 8254, 1241, 0, 0, - 0, 1254, 1197, 0, 0, 0, 1251, 0, 272, 0, - 0, 0, 1131, 886, 1258, 0, 0, 0, 0, 0, - 0, 0, 0, 1312, 1366, 0, 0, 0, 0, 0, - 0, 1259, 1260, 8254, 0, 0, 0, 0, 92, 546, - 546, 0, 1131, 0, 0, 0, -187, -187, 0, 0, - 0, 0, 0, 0, 0, 9966, 9966, 0, 0, 0, - 0, 0, 1264, 1261, 1262, 0, 0, 0, - }; - protected static readonly short [] yyRindex = { 1802, - 0, 0, 7193, 1802, 0, 0, 0, 1635, 0, 0, - 3004, 2835, 0, 0, 0, 0, 0, 3004, 0, 0, - 35, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 685, 685, 89, 89, -273, -273, -273, -273, -265, -265, + 413, 529, 561, 553, 557, 0, -149, -181, 0, 9201, + 964, -8, 965, -8, 9201, 9201, 879,11135, 0, 0, + 850, 0, -8, 0, 512, 791, 0, 0, 0, 0, + 240, 367, 16, 0, 8904, 559, 0, 889, 888, 0, + 0, 0, 0, 0, 0, 228, 891, 0, 892, 897, + 0, 0, 0, 0, 893, 9061, 855, 0, 398, 0, + 0, 220, 0,11271, 0, 896, 0, 0, 0, 555, + 90, 908, 0, 907, 911, 912, 0, 0,11135, 0, + -8, 0, 0, 624, 0, 914, 0, 266, 0, 0, + 7041, 0, 7041, 8573, 0, 4875, 0, 0,10727, 161, + 0, -12, -66, 0, 862, 866, 0, -64, 0, 0, + 910, 0, 0, 0, 0, 0, 919, 0, 0, 928, + 0, 7686, 0, 429, 0, 0, 458, 463, 875, 0, + 39, 0, 925, 930, 0, 0, 7041, 0, 0, 7041, + 0,11135, 0,11135, 8590, 0, 0, 429, 926, 429, + 0, 0, 0, 0, 0, 0, 0, 0, 9201, 8590, + 0, 0, -8,12505, 961, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0,10319, 0, + 0, 0, 0, 7826, 0, 9201, 0, 7983, 931, 0, + 0, 0, 0, 1012, 0, 1014, 0, 0, 0, 652, + 0, 935, 0, 0, 0, 0, 0, 0, 894, 0, + 71, 0, 0, 0, 0, 559, 559, 0, 792, 940, + 943, 900, 948, 855, 0, 944, 0, 1064, 1065, 0, + 0,11135, 0,10863, 950, 555, 8904, 8590, 0, 0, + 180, 1066, 1070, 122, 946, 0, 0, 0,11135, 0, +11135, 1049, 0, 0, 0, 0, 40,10999, 0, 0, + 0, 0, 8119, 0, 1074, 0, 617,11135, 968, 8573, + 970, 0, 0, -8, 0, 195, 0, 0, 791, 875, + 0, -8, 0, -161, 0, 0, 0, 967, 0, 997, + 0, 0, 0, 0, 0, 0, 0, 730, 0, 0, + 0, 0, 0, 8747, 0, 0, -8, 549, 931, 0, + 9201, 0, 9201, 0, 998, 9201, 0, 0, 0, 680, + 0, 0, 0, 980, 792, 0, 0,11407, 0, 0, + 0, 972, 7843, 0, 855, 0, 855, 0, 855, 0, + 0, 0, 0, -8, 975, 950, 0, 0, 0, -162, + -156, 978, 979, 0, 0, 0, 0, 0, 981, 8573, + 931, -181,11135, 0, 983, 7041, 0, 0, 0, 0, + 0, 0, 986, 0, 764, 0, 0, 0, 0, 0, + -189, 0, 987, 791, 875, 0, 875, 0, 931, 988, + 0, 0, 429, 0, 938, 977, 0, 0, 0, 0, + 0, 9201, 1015, 9201, 9201, 0,11135, 0, 0, 897, + 239, 731, 0, 0, 0, 0, -38, 0, 0, 0, + 1002, 0, 0, 0, 989, 0, 0, 0, 523, 0, + 990, 1116, 1117, 0, 0, 931, 1003, 931, 1005, 0, + 1006, 0, 0, 0, 0, 0,11135, 0, 1013, -154, + 0, -154, 0, 0, 0, 0, 0, 0, 429, 0, +11135, 8278, 0, 0, 1027, 0, 736, 1009, 0, 1016, + 0, 0,11407, 249, 59, 0, 1017, 1017, 1017,10863, + 1018, 0,11135, 0, 0, 0, 0, 0, 0, 7041, + -80, 0, 0, 7198, 0, 743, 7041, 0, 1019, 0, + 9201, 0, 0, 0, 0, 0,11135, 0, 0, 367, + 1026, 367, 8590, 1045, 1045, 1045, 0, 0,11135, 0, + 7041, 9358, 0, 0, 0, 7198, 0, 0, 0, 0, + 0, 1043, 9201,11135, 0, 367, 1029, 0, 982, 0, + 1028, 0, 0, 38, 0, 985, 0, 1045, 0, 0, + 0, 0, 0, 0, 0, 1032, 914, 0, 7198, 0, + 1051, 0, 1030, 1045, 0, 1033, 367, 0, 8590, -76, + 1038, 0, 1041, 1044, 7041, 1042, 9201, 0, 0, 0, + 0, 1031, 1030, 0, 0, 0,12111, 120, 367, 0, + 0, 0, 1059, 9201, 1040,11135, 0, 0, 1046, 0, + 0, 1047, 0, 0,13194, 800, 0, 1050, 120, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 1636, 0, 0, 1636, 0, 0, 1635, - 1191, 2878, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 1270, 0, 0, 0, 0, 0, 0, 0, 0, -12202, 0, 1263, 0, 0, 0, 1263, 0, 0, 0, - 0, 0, 0, 199, 0, 0, 0, 0, 0, 0, - 0, 0, 171, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 4424, 0, 0, 0, 0, - 0, 0, 331, 4583, 3794, 0, 0, 4359, 0, 0, + 0, 540,13194, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 1054, 367, 0, 120, -8, 0, 1059, 0, + 0, 1061,12111,12277, 0, 0, 0, 27, 0, 0, + 0,12309, 0, 0, 1055, 0, 0, 0, 0, 8590, + 8590, 309, 8747, 312, 458, 1082, 0, 228, 4646, 0, + 1129, 0, 0, 1030, 0, 0, 0, 1030, 0, 1021, + 1034, 0, 8590, -147, 0, 8590, 0, 1056, 1072, 0, + 228, 0, 62, 5003, 0, 1067, 1057, 24, 511, 3907, + 0, 0, 1030, 0, 228, 0, 1068, 1058, 1073, 1071, + 0, 1075, 1034, 1078, 59, 1080, 1083, 0, 0, 1091, + 1097, 0, 791, 0, 766, 0, 0, 0, 1096, 0, + -97, 0, 1087, 0, 0, 1103, 0, 1107, 1108, 1110, + 0, 1063, 0, 59, 59, 0, 59, 1106, 1112, 0, + 0, 0, 0, 1109, 127, 0, 1115, 59, 1234, 1118, + 59, 0, 27, 0, 8573, 1079, 1120, 1063, 0, 1119, + 1121, 129, 1128, 0, 0, 59,10863, 1084, 1125, 1109, + 0, 0,13194, 0, 367, 367, 0, 1085, 1130, 1115, + 0, 1132, 0,11135, 1090, 1133, 1118, 0, 1139, 59, + 0, -74, 0, 1124, 0, 0, 0, 0, 0,13194, + 0, 129, 129, 1145, 1141, 0, -97, 0, 0, 106, + 1146,13194, 0,13194, 0, 0, 8573, 1134, 0, 0, + 0, 1149, 1103, 0, 0, 0, 1151, 0, 445, 0, + 0, 0, 1045, 794, 1150, 0, 0, 0, 0, 0, + 0, 0, 0, 1206, 1261, 0, 0, 0, 0, 0, + 0, 1155, 1157, 8573, 0, 0, 0, 0, 129, 542, + 542, 0, 1045, 0, 0, 0, -79, -79, 0, 0, + 0, 0, 0, 0, 0,10455,10455, 0, 0, 0, + 0, 0, 1161, 1158, 1159, 0, 0, 0, + }; + protected static readonly short [] yyRindex = { 1916, + 0, 0, 7355, 1916, 0, 0, 0, 1532, 0, 0, + 3243, 1827, 0, 0, 0, 0, 0, 3243, 0, 0, + 55, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 4739, 4807, - 5151, 5355, 5695, 5899, 6035, 6171, 6307, 6443, 4517, 3685, - 0, 0, 0, 0, 0, 0, 35, 0, 0, 0, + 0, 0, 0, 1533, 0, 0, 1533, 0, 0, 1532, + 3286, 3157, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 1167, 0, 0, 0, 0, 0, 0, 0, 0, + 9218, 0, 1160, 0, 0, 0, 1160, 0, 0, 0, + 0, 0, 0, -280, 0, 0, 0, 0, 0, 0, + 0, 0, 234, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 4714, 0, 0, 0, 0, + 0, 0, 182, 4873, 4084, 0, 0, 4649, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 235, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 909, 909, 3047, 0, - 510, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 5029, 5097, + 5441, 5645, 5985, 6189, 6325, 6461, 6597, 1264, 1413, 2967, + 0, 0, 0, 0, 0, 0, 55, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 207, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 3329, 0, + 599, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 1636, 131, 0, 0, 0, 0, 0, 0, - 0, 3110, 306, 3153, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 3405, 0, 0, 0, 0, + 0, 0, 1533, 136, 0, 0, 0, 0, 0, 0, + 0, 3372, 355, 3415, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 3695, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 1273, 0, 0, 0, 0, 0, - 3405, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 2341, 0, 2705, 654, - 2471, 0, 0, 0, 2601, 2471, 0, 0, 0, 0, - 0, 1270, 0, 0, 0, 129, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 1266, 1330, 0, 0, 1263, 0, 3405, 0, 0, 0, - 0, 0, 0, 0, 0, 0, -1, 0, 0, 0, + 0, 0, 0, 0, 0, 1172, 0, 0, 0, 0, + 0, 0, 3695, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 2517, + 0, 3027, 119, 2647, 0, 0, 0, 2777, 2647, 0, + 0, 0, 0, 0, 1167, 0, 0, 0, 51, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 1163, 2881, 0, 0, 1160, 0, 3695, + 0, 0, 0, 0, 0, 0, 0, 0, 0, -41, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 1476, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 90, 0, 0, 0, 0, 0, 0, 0, 3196, 3239, - 0, 0, 0, 0, 2195, 1636, 1636, 0, -200, 0, - 7976, 1636, 1642, 0, 0, 157, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 403,11611, 0, 0, 0, 0, 3405, - 0, 0, 0, 0, 0, 0, 0, 0,12000, 0, - 0, 0, 0, 0, 0, 0, 726, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 1021, 1145, 0, 0, - 1276, 0, 0, 0, 0, 0, 140, 0, 0, 3882, - 1274, 0, 0, 0, 483, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 1902, 0, 0, 0, 0, 0, + 1656, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 3975, 0, 0, 0, 0, + 0, 0, 0, 3482, 3529, 0, 0, 0, 0, 2371, + 1533, 1533, 0, -132, 0, 8000, 1533, 1541, 0, 0, + 197, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 417,11964, + 0, 0, 0, 0, 3695, 0, 0, 0, 0, 0, + 0, 0, 0,12353, 0, 0, 0, 0, 0, 0, + 0, 637, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 591, 973, 0, 0, 1176, 0, 0, 0, 0, + 0, 140, 0, 0, 4172, 1173, 0, 0, 0, 407, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 2078, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 1266, 0, - 0, 6562, 0, 141, 0, 0, 0, 0, 0, 0, - 8882, 0, 0, 0, 0, 0, 0, 50, 521, 0, - 0, 0, 1275, 0, 0, 0, 0, 0, 0, 0, - 3405, 0, 3405, 0, 4041, 0, 0, 0, 0, -21, - 0, 0, 0, 0, 12, 0, 0, 0, 4911, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 4979, 5083, 5219, 5287, 5423, - 5491, 5559, 5627, 5763, 5831, 5967, 6103, 6239, 6375, 6499, - 0, 0, 584, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 284, 0, 0, 2195, 0, 0, - 0, 0, 1227, 9230, 0, 0, 0,12234, 0, 0, - 748, 0, 0, 0, 0, 0, 0, 671, 651, 0, - 0, 1279, 0, 0, 0, 0, 1283, 0, 0, 0, - 0, 0, 0,11190, 0, 0, 0, 756, 0, 0, - 0,12278, 0, 0, 776, 814, 815, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 731, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 1285, 0, 0, 0, - 3471, 0, 0, 150, 0, 163, 3564, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 1286, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 237, 592, 0, - 0, 0, 0, 0, 1287, 0, 0, 0, 0, 0, + 0, 0, 0, 1163, 0, 0, 6724, 0, 145, 0, + 0, 0, 0, 0, 0, 9515, 0, 0, 0, 0, + 0, 0, -158, 380, 0, 0, 0, 1174, 0, 0, + 0, 0, 0, 0, 0, 3695, 0, 3695, 0, 4331, + 0, 0, 0, 0, -284, 0, 0, 0, 0, 130, + 0, 0, 0, 5201, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 8882, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 5269, 5373, 5509, 5577, 5713, 5781, 5849, 5917, 6053, 6121, + 6257, 6393, 6529, 6665, 1918, 0, 0, 563, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 3975, 0, 0, 0, 0, 2371, 0, 0, 0, 0, + 1131, 9719, 0, 0, 0, 9375, 0, 0, 737, 0, + 0, 0, 0, 0, 0, 693, -247, 0, 0, 1177, + 0, 0, 0, 0, 1181, 0, 0, 0, 0, 0, + 0,11543, 0, 0, 0, 741, 0, 0, 0,12618, +12429, 0, 0, 752, 757, 768, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 640, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 1183, 0, 0, 0, 3761, + 0, 0, 151, 0, 57, 3854, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 1184, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 236, 709, 0, 0, + 0, 0, 0, 1182, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 9515, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 191, 0, 0, 0, 14, 0, - 0, 0, 0, 0, 0, 0, 0, 633, 0, 384, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - -200, 0, 0, 0, 0,12278, 8271, 0, 1281, 0, - 743, 0, 0, 0, 0, 1288, 0, 1239, 1240, 0, - 0, 0, 0, 0, 1284,12310, 0, 0, 0,12076, - 0, 0, 0, 777, 0, 0, 0, 0, 0, 0, - 2069, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 3723, 0, 4200, 1293, 0, - 0, 0, 1290, 0, 0, 0, 0, 425, 0, 0, - 0, 0, 777, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 620, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 606, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, -186, + 0, 504, 0, 0, 0, 0, 0, 0, 0, 0, + -132, 0, 0, 0, 0,12618, 8295, 0, 1185, 0, + 666, 0, 0, 0, 0, 1189, 0, 1140, 1142, 0, + 0, 0, 0, 0, 1186,12672, 0, 0, 0, 0, +12461, 0, 0, 0, 769, 0, 0, 0, 0, 0, + 0, 2245, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 4013, 0, 4490, 1191, + 0, 0, 0, 1192, 0, 0, 0, 0, 318, 0, + 0, 0, 0, 769, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 818, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 579, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 1289, 0, 0, 0, 0, 0, - 839, 842, 0, 0, 0, 0, 0, 0, 0, 1292, - 685, 749, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 3882, 0, 0, 0, 0, 0, 1298, - 0, 0, 425, 0, 0, 891, 0, 1292, 0, 0, - 0, 8882, 0, 642, 656, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 124, 0, 1279, 9076, - 0, 0, 0, 0, 0,12352, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 696, 0, 723, - 0, 0, 0, 0, 906, 0, 763, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 1300, 0, - 7350, 0, 0, 0, 0, 0, 0, 8882, 0, 0, - 0, 0, 0, 0, 808, 854, 0, 0, 0, 0, - 0, 0, 0,12428,12000, 0, 495, 495, 495, 0, + 0, 0, 0, 0, 0, 0, 0, 778, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 1193, 0, 0, 0, 0, + 0, 784, 785, 0, 0, 0, 0, 0, 0, 0, + 1195, 649, 1194, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 4172, 0, 0, 0, 0, 0, + 1197, 0, 0, 318, 0, 0, 816, 0, 1195, 0, + 0, 0, 9515, 0, 572, 595, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 1177, + 9565, 0, 0, 0, 0, 0,12714, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 665, 0, + 678, 0, 0, 0, 0, 1199, 0, 671, 1198, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 1212, + 0, 7512, 0, 0, 0, 0, 0, 0, 9515, 0, + 0, 0, 0, 0, 0, 0, 294, 550, 0, 0, + 0, 0, 0,12790,12353, 0, 371, 371, 371, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -12471, 0, 31, 0, 1303, 1303, 1303, 0, 0, 0, - 0, 0, 1299, 0, 0, -171, 0, 0, 0, 0, - 0, 0, 0, 0, 0,12514, 0, 0, 0, 0, - 1304, 0, 0, 497, 0, 0, 0, 553, 0, 0, - 0, 0, 0, 0, 0, 0, 1301, 0, 1307, 0, - 0, 0, 2921, 1313, 508, 0, 225, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0,12895, + 0, -271, 0, 1214, 1214, 1214, 0, 0, 0, 0, + 0, 1210, 0, 0, 0, -157, 0, 0, 0, 0, + 0, 0, 0, 0, 0,12938, 0, 0, 0, 0, + 1217, 0, 0, 375, 0, 0, 0, 544, 0, 0, + 0, 0, 0, 0, 0, 0, 1216, 0, 1218, 0, + 0, 0, 3200, 1213, 414, 0, -14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 1652, 0, 0, 0, 0, 9335, 9533, 0, - 0, 0, 935, 0, 0, 0, 0, 0, 0, 0, - 0, 439, 0, 0,11782, 9627, 0, 0, 9434, 0, + 0, 0, 1553, 0, 0, 0, 0, 9824,10022, 0, + 0, 0, 641, 0, 0, 0, 0, 0, 0, 0, + 0, 534, 0, 0,12135,10116, 0, 0, 9923, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0,11850, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 9713, 0, 9335, 0, 0, 935, 0, - 0, 0, 0, 403, 0, 0, 0, 0, 0, 0, - 0, 403, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 817, 412, 0, 9755, 0, 0, - 0, 1040, 0, 1652, 0, 0, 0, 1652, 0, 0, + 0, 0,12203, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0,10202, 0, 9824, 0, 0, 641, 0, + 0, 0, 0, 417, 0, 0, 0, 0, 0, 0, + 0, 417, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 744, 433, 0,10244, 0, 0, + 0, 1148, 0, 1553, 0, 0, 0, 1553, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - -88, 0, 1321, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 1652, 0, 600, 0, 655, 0, 0, 0, - 0, 0, 0, 0,12000, 849, 0, 0, 0, 0, - 0, 0, 1317, 0, 84, 0, 0, 0, 0, 0, - 0, 0, 852, 0, 0, 0, 0, 0, 0, 0, - 0, 1315, 0,12000,12000, 0,12032, 0, 0, 0, - 0, 0, 0, 1316,12738, 0, 1318,12000,11326, 1319, -12000, 0, 0, 0, 0, 0, 0, 1320, 0, 0, - 0,12708, 0, 0, 0,12000, 0, 0, 0, 1331, - 0, 0, 298, 0,12632,12670, 0, 0, 0, 1334, - 0, 0, 0, 0, 0, 0, 1335, 0, 0,12000, - 0, 570, 0, 853, 0, 0, 0, 0, 0, 907, - 0,12556,12594, 0, 0, 0, 0, 0, 0, 0, - 0, 1402, 0, 1455, 0, 0, 0, 858, 0, 0, + 190, 0, 1224, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 1553, 0, 763, 0, 623, 0, 0, 0, + 0, 0, 0, 0,12353, 790, 0, 0, 0, 0, + 0, 0, 1188, 0, 221, 0, 0, 0, 0, 0, + 0, 0, 798, 0, 0, 0, 0, 0, 0, 0, + 0, 1219, 0,12353,12353, 0,12385, 0, 0, 0, + 0, 0, 0, 1220,13132, 0, 1221,12353,11679, 1222, +12353, 0, 0, 0, 0, 0, 0, 1229, 0, 0, + 0, 1266, 0, 0, 0,12353, 0, 0, 0, 1230, + 0, 0, 232, 0,13056,13094, 0, 0, 0, 1231, + 0, 0, 0, 0, 0, 0, 1245, 0, 0,12353, + 0, 554, 0, 803, 0, 0, 0, 0, 0, 828, + 0,12980,13018, 0, 0, 0, 0, 0, 0, 0, + 0, 1277, 0, 1330, 0, 0, 0, 811, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 580, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 556, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0,12708, 9070, -11498, 0, 580, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 1274, 1274, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 1266,11851, +12832, 0, 556, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 1173, 1173, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }; protected static readonly short [] yyGindex = { 0, - 0, 1671, 0, 0, 0, -3, -10, -177, -46, -40, - 0, 1711, 1728, 563, 0, 5, 0, 0, 0, 0, - 0,-1062, -696, -216, -455, 0, 0, 0, 0, 0, - -221, 0, 0, 0, 790, 0, 896, 0, 0, 0, - 0, 643, 649, -17, -230, 0, 3, 0, 488, 0, - 518, -655, -543, -536, -535, -516, -513, -464, -458, 0, - 0,-1125, 0, 1, 0, 192, 0,-1098, 0, 0, - 0, -41, 312, 0, 0, 0, 345,-1072, 0, -274, - -288, 1074, 0, 0, 0, -889, 302, 0, 0, -504, - 0, 0, 363, 0, 0, 337, 0, 0, 373, 0, - -494, -775, 0, 0, 0, 0, 0, 468, -13, 0, - 0, 898, 917, 919, 1069, -528, 0, 0, -321, 920, - 474, 0, -888, 0, 0, 0, 0, 0, 0, 0, - 0, 274, 0, 0, 0, 0, 0, 0, 0, 0, - 526, 0, 0, 0, 0, -269, 462, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 542, 0, -505, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 297, 0, - 0, 380, 0, 0, 386, 390, 303, 0, 0, 0, - 0, 0, 0, 0, 0, 609, 0, 0, 0, 0, - -39, 0, 136, -68, 0, 0, 453, 0, 511, 0, - 968, 0, 1278, -296, -275, -58, 882, 0, 614, 0, - -38, 107, 0, 0, 668, 0, 0, 0, 0, 0, + 0, 1544, 0, 0, 0, -2, -9, -179, -48, -43, + 0, 1588, 1617, 589, 0, 3, 0, 0, 0, 0, + 0,-1109, -711, -213, -432, 0, 0, 0, 0, 0, + -228, 0, 0, 0, 668, 0, 775, 0, 0, 0, + 0, 524, 530, -17, -236, 0, -46, 0, 359, 0, + 396,-1114, -607, -598, -534, -519, -516, -513, -500, 0, + 0,-1173, 0, 1, 0, 86, 0,-1098, 0, 0, + 0, -44, 179, 0, 0, 0, 227,-1059, 0, -272, + -279, 955, 0, 0, 0, -894, 181, 0, 0, -505, + 0, 0, 245, 0, 0, 215, 0, 0, 252, 0, + -721, -968, 0, 0, 0, 0, 0, 349, -13, 0, + 0, 779, 780, 782, 949, -537, 0, 0, -323, 796, + 341, 0,-1330, 0, 0, 0, 0, 0, 0, 0, + 0, 149, 0, 0, 0, 0, 0, 0, 0, 0, + 394, 0, 0, 0, 0, -339, 331, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 408, 0, -515, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 165, 0, + 0, 248, 0, 0, 254, 256, 172, 0, 0, 0, + 0, 0, 0, 0, 0, 477, 0, 0, 0, 0, + -42, 0, 373, -138, 0, 0, 320, 0, 377, 0, + 838, 0, 1153, -295, -263, -63, 1025, 0, 479, 0, + -33, 112, 0, 0, 1152, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, -263, 0, 18, 0, 0, -750, 0, 0, 0, - 924, 0, -300, -130, 1088, 1010, 0, 1002, 0, 1222, - 1447, 1133, 0, 0, 822, 1746, 0, 0, 0, 0, - 1101, 0, 0, 0, 0, 0, -626, 1489, 0, 0, - 0, 0, 0, 1215, 389, 903, 779, 902, 1436, 1437, - 1438, 1440, 1435, 0, 1439, 0, -374, 0, 0, 1060, - 1341, -731, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, -295, 0, 0, 0, 0, -447, 0, 674, - 0, 590, 0, 677, 0, 0, 0, 781, -530, -15, - -305, -2, 0, 1734, 0, 41, 0, 44, 99, 103, - 109, 159, 165, 166, 167, 173, 185, 0, -639, 0, - -18, 0, 0, 923, 0, 836, 0, 0, 0, 0, - 816, -131, 890, -810, 0, 938, -467, 0, 0, 0, - 0, 0, 0, 831, 0, 0, 830, 0, 0, 0, + 0, -262, 0, 1209, 0, 0, -130, 0, 0, 0, + 799, 0, -302, -129, 952, 874, 0, 868, 0, 1093, + 1319, 1000, 0, 0, 686, 1624, 0, 0, 0, 0, + 1008, 0, 0, 0, 0, 0, -599, 1363, 0, 0, + 0, 0, 0, 1327, 343, 806, 704, 802, 1315, 1298, + 1333, 1335, 1332, 0, 1334, 0, -608, 0, 0, 947, + 1190, -747, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, -294, 0, 0, 0, 0, -454, 0, 562, + 0, 472, 0, 558, 0, 0, 0, 619, -530, -5, + -314, -3, 0, 1585, 0, 46, 0, 82, 84, 85, + 91, 117, 118, 125, 126, 132, 134, 0, -664, 0, + -27, 0, 0, 758, 0, 681, 0, 0, 0, 0, + 659, -145, 734, -870, 0, 797, -468, 0, 0, 0, + 0, 0, 0, 674, 0, 0, 673, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 764, 0, 0, 0, 0, 0, 0, 0, - 0, -43, 0, 1381, 0, 0, 0, 1008, 0, 0, - 0, 0, 0, 0, -169, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 1491, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 657, 0, 0, 0, - 0, 0, 0, 0, 0, 760, 0, 0, 0, 0, - 0, 0, -11, 1078, 0, 0, 0, 1092, + 0, 0, 604, 0, 0, 0, 0, 0, 0, 0, + 0, -19, 0, 1228, 0, 0, 0, 857, 0, 0, + 0, 0, 0, 0, -170, 0, 0, 0, 0, 0, + 1345, 1123, 0, 0, 0, 1347, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 506, 0, 0, 0, 0, + 0, 0, 0, 0, 614, 0, 0, 0, 0, 0, + 0, 2, 929, 0, 0, 0, 933, }; protected static readonly short [] yyTable = { 109, - 18, 155, 517, 111, 233, 732, 43, 189, 737, 514, - 234, 429, 468, 490, 156, 447, 472, 682, 428, 703, - 257, 510, 533, 776, 192, 316, 404, 1138, 544, 571, - 557, 498, 1014, 308, 949, 229, 14, 1170, 1171, 910, - 259, 890, 784, 708, 251, 323, 328, 190, 789, 539, - 1066, 506, 675, 807, 361, 302, 369, 160, 772, 302, - 161, 332, 1047, 411, 1049, 309, 353, 311, 1508, 1, - 292, 665, 871, 360, 872, 368, 1065, 337, 261, 1330, - 411, 572, 285, 286, 287, 1201, 293, 294, 1066, 322, - 327, 306, 307, 47, 334, 1007, 793, 666, 312, 1264, - 314, 20, 318, 481, 288, 47, 1206, 330, 331, 1471, - 16, 869, 289, 1458, 443, 162, 1019, 1272, 902, 163, - 1200, 904, 432, 115, 249, 164, 988, 1372, 833, 667, - 349, 367, 634, 409, 652, 472, 1016, 997, 781, 109, - 1217, 155, 233, 111, 1017, 346, 412, 290, 430, 870, - 290, 413, 711, 414, 156, 194, 6, 436, 437, 415, - 416, 1472, 507, 412, 508, 115, 249, 339, 413, 115, - 414, 2, 881, 250, 406, 165, 415, 416, 808, 94, - 782, 166, 167, 168, 795, 446, 410, 482, 1509, 169, - 1188, 430, 1338, 347, 713, 196, 793, 160, 15, 290, - 161, 170, 291, 333, 1067, 291, 726, 42, 468, 191, - 873, 438, 447, 199, 676, 250, 348, 47, 509, 478, - 979, 730, 194, 194, 1048, 1207, 1050, 571, 444, 471, - 349, 1321, 1459, 668, 476, 1322, 417, 3, 4, 5, - 6, 1331, 1067, 194, 1019, 488, 257, 231, 557, 473, - 793, 432, 1373, 427, 291, 162, 257, 751, 532, 163, - 1350, 477, 536, 115, 519, 164, 486, 541, 712, 48, - 489, 312, 1005, 557, 367, 493, 495, 1440, 339, 572, - 1079, 885, 339, 432, 334, 115, 540, 115, 580, 520, - 882, 949, 115, 690, 528, 531, 530, 1344, 796, 529, - 493, 572, 686, 54, 1464, 363, 563, 1339, 1189, 831, - 714, 578, 546, 547, 511, 165, 1474, 559, 1475, 1132, - 556, 166, 167, 168, 1436, 538, 339, 527, 969, 169, - 543, 1224, 1090, 558, 194, 194, 834, 302, 1402, 349, - 802, 170, 740, 614, 615, 1062, 1118, 1429, 471, 592, - 625, 832, 625, 600, 601, 602, 603, 604, 605, 606, - 607, 608, 609, 610, 1485, 757, 649, 2, 473, 473, - 449, 637, 639, 760, 560, 200, 977, 1074, 691, 1075, - 1302, 753, 233, 450, 998, 632, 349, 572, 430, 753, - 1345, 115, 653, 1304, 1505, 886, 194, 803, 315, 887, - 983, 683, 642, 643, 863, 911, 231, 625, 751, 385, - 885, 20, 363, 6, 354, 636, 638, 640, 949, 363, - 115, 363, 194, 363, 650, 651, 773, 449, 638, 1303, - 663, 920, 468, 638, 194, 647, 742, 638, 903, 903, - 450, 194, 115, 231, 231, 386, 937, 938, 47, 669, - 349, 231, 638, 498, 349, 472, 334, 349, 741, 349, - 231, 523, 355, 571, 349, 581, 699, 363, 702, 349, - 1144, 878, 902, 902, 1054, 582, 678, 1150, 745, 638, - 679, 758, 644, 194, 742, 94, 194, 774, 701, 761, - 709, 728, 978, 592, 1295, 735, 683, 349, 638, 700, - 432, 349, 1173, 349, 349, 349, 349, 437, 684, 742, - 744, 349, 791, 473, 793, 572, 794, 438, 903, 762, - 194, 194, 986, 356, 764, 387, 388, 1481, 887, 750, - 949, 749, 879, 759, 967, 1482, 949, 244, 556, 939, - 743, 680, 483, 1466, 1467, 742, 262, 777, 194, 194, - 484, 558, 902, 1245, 1020, 1211, 1022, 683, 1024, 1360, - 638, 737, 454, 556, 454, 962, 194, 737, 437, 684, - 797, 797, 783, 411, 918, 1305, 558, 638, 438, 826, - 194, 726, 638, 197, 347, 290, 638, 572, 1390, 1391, - 290, 1393, 317, 115, 290, 883, 1483, 730, 1245, 432, - 1499, 638, 1412, 485, 94, 1419, 433, 348, 356, 434, - 993, 248, 638, 1346, 197, 776, 737, 811, 346, 454, - 1435, 349, 939, 818, 1306, 517, 847, 939, 638, 939, - 939, 939, 939, 939, 939, 939, 939, 939, 939, 814, - 291, 816, 47, 346, 1457, 898, 1082, 638, 1084, 1003, - 848, 939, 730, 939, 356, 939, 412, 939, 939, 939, - 115, 413, 752, 414, 433, 1246, 347, 825, 471, 415, - 416, 346, 1247, 1248, 636, 703, 245, 849, 257, 846, - 246, 877, 493, 637, 194, 115, 1058, 971, 473, 348, - 536, 347, 1249, 327, 358, 1250, 94, 735, 636, 327, - 249, 893, 728, 349, 865, 730, 194, 637, 1101, 1091, - 1246, 583, 939, 1126, 348, 231, 1035, 1247, 1248, 347, - 1102, 584, 927, 315, 907, 636, 258, 927, 349, 927, - 247, 894, 927, 927, 637, 927, 927, 1249, 361, 912, - 1250, 431, 348, 358, 1251, 905, 1152, 906, 327, 250, - 1252, 347, 1227, 1244, 899, 908, 349, 777, 599, 359, - 258, 225, 811, 226, 258, 258, 258, 258, 258, 258, - 258, 258, 315, 1227, 348, 616, 617, 664, 1181, 866, - 348, 334, 592, 867, 653, 315, 913, 592, 811, 1251, - 735, 1111, 194, 334, 790, 1252, 334, 334, 1244, 715, - 1227, 347, 473, 811, 811, 664, 1326, 473, 557, 347, - 334, 962, 927, 194, 664, 401, 970, 522, 115, 1340, - 115, 260, 1213, 348, 348, 939, 358, 402, 1141, 649, - 523, 94, 348, 657, 959, 658, 489, 792, 1358, 1259, - 557, 329, 433, 669, 951, 741, 349, 524, 1055, 361, - 361, 361, 984, 361, 361, 315, 361, 1089, 361, 987, - 357, 657, 1035, 658, 115, 1172, 682, 115, 370, 995, - 358, 735, 565, 557, 856, 320, 1055, 334, 194, 566, - 1423, 320, 334, 334, 827, 334, 895, 44, 321, 334, - 397, 567, 601, 334, 601, 1001, 828, 1004, 113, 315, - 361, 194, 361, 1006, 398, 361, 334, 565, 391, 392, - 1039, 811, 94, 811, 566, 811, 194, 389, 390, 661, - 194, 1199, 393, 394, 1147, 1148, 567, 1015, 661, 1034, - 295, 1108, 296, 1269, 826, 1109, 269, 269, 334, 447, - 113, 1261, 1476, 850, 113, 269, 660, 741, 669, 473, - 851, 749, 258, 1156, 1041, 660, 1042, 749, 1043, 749, - 327, 735, 258, 327, 493, 1044, 339, 258, 326, 326, - 339, 933, 334, 339, 194, 339, 933, 399, 933, 1496, - 339, 933, 933, 412, 933, 933, 517, 754, 413, 326, - 414, 754, 194, 194, 1292, 754, 415, 416, 777, 403, - 1514, 1515, 1292, 811, 468, 811, 933, 1085, 503, 770, - 334, 400, 504, 770, 339, 770, 334, 770, 395, 396, - 64, 64, 334, 759, 64, 334, 334, 759, 279, 759, - 279, 759, 1094, 296, 225, 279, 228, 258, 113, 334, - 334, 334, 685, 334, 334, 56, 686, 435, 489, 258, - 258, 258, 1147, 1148, 258, 258, 749, 194, 749, 225, - 749, 933, 1119, 735, 777, 168, 439, 168, 718, 168, - 811, 334, 719, 332, 741, 1034, 1013, 356, 805, 194, - 326, 326, 489, 1131, 233, 489, 1159, 194, 491, 727, - 430, 115, 180, 504, 180, 473, 180, 817, 556, 442, - 356, 817, 821, 811, 470, 1092, 821, 1093, 962, 233, - 1155, 558, 65, 356, 469, 430, 65, 969, 356, 969, - 822, 231, 489, 356, 822, 356, 356, 356, 356, 761, - 556, 761, 492, 356, 753, 811, 1085, 356, 753, 513, - 1159, 356, 326, 558, 359, 156, 936, 156, 880, 356, - 880, 936, 356, 936, 356, 518, 936, 936, 521, 936, - 936, 1225, 1243, 556, 537, 1221, 113, 1226, 326, 620, - 621, 622, 623, 382, 383, 384, 558, 542, 356, 811, - 326, 936, 1225, 163, 164, 163, 164, 326, 1226, 67, - 5, 67, 929, 467, 231, 113, 811, 929, 489, 929, - 934, 935, 929, 929, 550, 929, 929, 1243, 186, 1225, - 186, 157, 576, 157, 348, 1226, 115, 113, 577, 432, - 115, 1221, 120, 115, 120, 284, 127, 284, 127, 326, - 585, 291, 326, 291, 356, 664, 936, 352, 1300, 1301, - 1123, 1124, 1337, 258, 1265, 231, 348, 439, 115, 1486, - 1487, 648, 115, 684, 1297, 710, 1337, 902, 902, 1276, - 687, 1329, 521, 521, 1332, 689, 326, 326, 716, 194, - 638, 638, 717, 923, 1368, 739, 1369, 756, 923, 763, - 923, 765, 929, 923, 923, 115, 923, 923, 766, 1136, - 1137, 618, 619, 767, 326, 326, 624, 625, 768, 785, - 355, 115, 786, 788, 800, 1347, 801, 335, 813, 805, - 815, 338, 339, 340, 341, 342, 343, 344, 345, 806, - 817, 823, 835, 355, 194, 836, 433, 838, 1403, 334, - 839, 842, 859, 42, 884, 854, 355, 860, 861, 196, - 862, 355, 194, 868, 230, 1430, 355, 888, 355, 355, - 355, 355, 889, 891, 900, 909, 355, 896, 1442, 1444, - 355, 901, 915, 923, 355, 925, 930, 735, 113, 1297, - 932, 936, 355, 940, 946, 355, 947, 355, 950, 489, - 949, 952, 955, 957, 258, 1430, 1430, 963, 497, 975, - 976, 334, 985, 334, 497, 992, 1452, 507, 194, 194, - 999, 355, 979, 1010, 249, 1011, 362, 194, 326, 1037, - 1028, 1045, 334, 334, 1061, 194, 194, 1051, 194, 1052, - 1053, 1063, 1080, 1104, 1317, 363, 364, 1073, 1077, 735, - 326, 1083, 334, 1081, 1088, 113, 1317, 1096, 194, 1100, - 334, 194, 1430, 334, 1103, 365, 1106, 5, 1105, 1317, - 1112, 47, 326, 250, 1122, 1125, 366, 355, 1127, 1139, - 113, 1134, 47, 1151, 1158, 1145, 735, 47, 1317, 1166, - 1180, 47, 1183, 1187, 47, 502, 1501, 1501, 1185, 1190, - 1195, 1199, 1203, 1510, 1510, 1198, 47, 47, 592, 592, - 1208, 47, 47, 1212, 1216, 1209, 1210, 47, 448, 47, - 47, 47, 47, 1257, 1266, 1263, 1262, 47, 473, 473, - 1273, 47, 498, 47, 335, 412, 1260, 412, 498, 1299, - 1278, 449, 1307, 47, 1320, 1335, 47, 1324, 47, 1325, - 1342, 1352, 47, 1334, 450, 1343, 412, 412, 326, 452, - 1354, 1355, 1345, 545, 453, 1357, 454, 455, 456, 457, - 1359, 1361, 47, 1363, 458, 1365, 412, 1371, 459, 326, - 1366, 1383, 1310, 1376, 412, 1379, 1382, 412, 1386, 1384, - 460, 1394, 1395, 461, 1398, 462, 1408, 1413, 1415, 1425, - 1424, 1427, 1428, 1434, 545, 334, 1437, 1438, 1449, 1448, - 1451, 334, 1454, 113, 1453, 113, 611, 612, 613, 463, - 1456, 545, 545, 545, 545, 545, 545, 545, 545, 545, - 545, 545, 545, 545, 545, 545, 545, 1462, 1468, 1469, - 1473, 1477, 1480, 1478, 326, 1488, 1472, 334, 1471, 1494, - 1495, 1516, 1517, 1518, 9, 965, 534, 602, 850, 113, - 492, 957, 113, 493, 672, 449, 603, 326, 29, 21, - 30, 27, 491, 29, 312, 1311, 207, 96, 517, 763, - 30, 858, 326, 755, 764, 787, 326, 788, 334, 660, - 824, 316, 826, 334, 683, 334, 334, 334, 334, 334, - 334, 334, 334, 334, 334, 334, 334, 341, 660, 334, - 123, 105, 334, 287, 130, 124, 334, 334, 334, 334, - 334, 334, 334, 334, 334, 334, 106, 334, 334, 288, - 131, 334, 334, 334, 334, 334, 638, 638, 334, 334, - 230, 545, 53, 334, 334, 334, 334, 334, 334, 334, - 334, 502, 21, 1029, 945, 1129, 502, 502, 326, 326, - 371, 1130, 334, 1275, 1439, 334, 1267, 334, 1470, 334, - 1426, 844, 334, 1455, 1479, 1421, 1314, 972, 334, 502, - 857, 372, 373, 374, 375, 376, 377, 378, 379, 380, - 381, 1512, 502, 502, 1327, 968, 973, 502, 974, 1274, - 502, 1349, 502, 1271, 502, 502, 502, 502, 1504, 1450, - 787, 1445, 502, 1503, 1443, 1204, 502, 1370, 941, 1318, - 502, 33, 1205, 326, 753, 991, 919, 876, 502, 917, - 799, 502, 587, 502, 502, 1064, 298, 874, 853, 502, - 548, 502, 502, 502, 502, 502, 502, 502, 502, 502, - 502, 502, 626, 326, 627, 630, 628, 502, 502, 629, - 631, 1192, 502, 502, 914, 502, 502, 502, 502, 502, - 502, 502, 1279, 502, 502, 1196, 502, 502, 502, 502, - 502, 502, 502, 502, 502, 502, 113, 502, 502, 502, - 502, 502, 502, 502, 502, 502, 502, 502, 502, 502, - 502, 502, 502, 502, 502, 502, 502, 502, 502, 770, - 405, 502, 1107, 502, 1146, 502, 1120, 1076, 502, 1113, - 1115, 852, 1046, 1057, 502, 746, 1177, 27, 27, 0, - 1008, 646, 27, 1182, 943, 1277, 27, 0, 27, 0, - 0, 27, 0, 27, 27, 0, 27, 942, 27, 0, - 27, 0, 27, 27, 27, 27, 0, 201, 27, 27, - 0, 0, 0, 0, 27, 0, 27, 27, 27, 0, - 0, 27, 27, 27, 0, 27, 0, 0, 27, 0, - 27, 27, 27, 27, 0, 0, 0, 27, 27, 27, - 0, 0, 27, 27, 27, 0, 0, 0, 0, 202, - 0, 27, 27, 0, 27, 27, 0, 27, 27, 27, - 0, 113, 0, 27, 0, 113, 0, 0, 113, 0, + 741, 18, 233, 111, 522, 473, 43, 234, 189, 434, + 477, 155, 746, 156, 577, 690, 495, 433, 452, 519, + 319, 293, 192, 712, 562, 257, 538, 407, 785, 549, + 576, 259, 921, 503, 515, 901, 827, 828, 793, 1025, + 325, 330, 326, 331, 251, 337, 1180, 1181, 229, 364, + 1147, 372, 437, 798, 955, 304, 882, 311, 883, 304, + 673, 1274, 160, 356, 544, 312, 1076, 314, 1030, 939, + 363, 717, 371, 781, 817, 14, 448, 340, 1077, 1282, + 1, 720, 739, 1210, 190, 335, 674, 627, 739, 627, + 511, 683, 20, 1058, 1018, 1211, 316, 364, 161, 1060, + 162, 163, 913, 1227, 1255, 915, 815, 164, 1340, 486, + 795, 1476, 1477, 1077, 412, 249, 394, 395, 675, 586, + 392, 393, 64, 64, 351, 409, 64, 843, 115, 587, + 396, 397, 477, 165, 166, 350, 1141, 739, 799, 109, + 233, 167, 168, 111, 627, 435, 47, 639, 169, 1255, + 170, 155, 939, 156, 441, 442, 16, 939, 1382, 939, + 349, 47, 939, 939, 250, 939, 939, 413, 1509, 42, + 115, 291, 260, 47, 115, 1154, 1518, 289, 291, 1216, + 922, 1468, 2, 451, 437, 290, 196, 939, 435, 892, + 804, 896, 760, 487, 1331, 1030, 6, 721, 1332, 818, + 478, 512, 160, 513, 364, 249, 473, 932, 350, 735, + 795, 364, 482, 364, 577, 364, 437, 483, 884, 990, + 452, 585, 676, 1360, 443, 816, 292, 336, 449, 476, + 576, 351, 1078, 292, 481, 739, 577, 15, 161, 1450, + 162, 163, 939, 493, 562, 352, 191, 164, 3, 4, + 5, 6, 257, 684, 250, 1059, 537, 514, 491, 364, + 541, 1061, 257, 524, 795, 546, 1474, 1078, 115, 562, + 1341, 494, 291, 165, 166, 1090, 498, 500, 1484, 543, + 1485, 167, 168, 1383, 548, 47, 545, 94, 169, 536, + 170, 525, 261, 1198, 1155, 896, 1519, 533, 1217, 535, + 1469, 657, 534, 498, 805, 897, 568, 893, 694, 898, + 1016, 955, 955, 722, 698, 551, 552, 1348, 749, 2, + 766, 564, 478, 478, 811, 577, 660, 292, 1100, 980, + 450, 1073, 1031, 561, 1033, 563, 691, 1036, 583, 782, + 304, 1128, 844, 619, 620, 869, 760, 1446, 1354, 769, + 388, 476, 597, 318, 291, 889, 605, 606, 607, 608, + 609, 610, 611, 612, 613, 614, 615, 361, 1481, 641, + 643, 642, 644, 647, 1495, 1234, 1370, 988, 565, 790, + 48, 812, 1412, 362, 1439, 233, 389, 450, 637, 841, + 435, 350, 194, 94, 1009, 661, 318, 115, 1314, 699, + 783, 291, 1305, 47, 1515, 1400, 1401, 997, 1403, 292, + 994, 1199, 743, 898, 874, 1085, 890, 1086, 685, 1422, + 1482, 791, 1429, 1093, 955, 1095, 1096, 231, 115, 723, + 955, 842, 1349, 473, 750, 437, 767, 1445, 655, 231, + 701, 1355, 658, 659, 710, 340, 718, 800, 671, 802, + 115, 803, 677, 6, 577, 1153, 909, 477, 231, 194, + 194, 1467, 1160, 503, 711, 770, 390, 391, 640, 478, + 576, 708, 473, 640, 350, 335, 350, 640, 686, 685, + 194, 335, 687, 357, 1065, 759, 1183, 335, 231, 768, + 335, 335, 640, 989, 640, 231, 737, 231, 597, 744, + 744, 451, 350, 349, 335, 488, 350, 438, 350, 350, + 350, 350, 686, 489, 751, 753, 350, 836, 439, 640, + 982, 880, 1162, 404, 771, 860, 508, 577, 792, 773, + 509, 358, 861, 837, 758, 405, 335, 437, 640, 743, + 1221, 888, 978, 688, 328, 838, 640, 744, 231, 942, + 328, 350, 786, 561, 1191, 563, 340, 291, 451, 881, + 340, 414, 335, 115, 1312, 115, 490, 1315, 438, 732, + 115, 194, 194, 686, 351, 806, 806, 930, 561, 439, + 563, 349, 245, 20, 973, 414, 246, 350, 352, 1336, + 735, 350, 359, 335, 350, 824, 350, 826, 1223, 328, + 349, 350, 1350, 115, 340, 894, 834, 357, 744, 197, + 94, 1256, 1014, 1313, 249, 1269, 1316, 54, 350, 1101, + 1257, 1368, 821, 199, 732, 785, 640, 821, 821, 350, + 830, 640, 942, 1004, 194, 640, 247, 942, 522, 942, + 197, 351, 942, 942, 415, 942, 942, 478, 350, 416, + 640, 417, 351, 357, 418, 419, 1256, 420, 421, 225, + 194, 226, 362, 250, 876, 1257, 352, 942, 415, 857, + 115, 351, 194, 416, 335, 417, 476, 640, 418, 419, + 194, 420, 421, 712, 1258, 352, 335, 856, 638, 335, + 335, 498, 257, 858, 541, 115, 640, 527, 1069, 1259, + 1491, 200, 1260, 335, 639, 1261, 744, 904, 1492, 659, + 528, 737, 638, 660, 910, 604, 438, 351, 1262, 439, + 859, 1046, 942, 194, 649, 739, 194, 529, 639, 1258, + 918, 801, 621, 622, 422, 231, 335, 659, 743, 638, + 905, 660, 335, 361, 1259, 923, 924, 1260, 335, 244, + 1261, 603, 335, 603, 916, 639, 917, 999, 432, 933, + 194, 194, 478, 1262, 919, 335, 786, 478, 1008, 1493, + 657, 821, 318, 362, 362, 362, 248, 362, 362, 1038, + 362, 321, 362, 436, 528, 1237, 1254, 321, 194, 194, + 263, 597, 661, 350, 322, 94, 597, 335, 821, 361, + 744, 754, 350, 724, 1121, 935, 1237, 415, 194, 562, + 398, 399, 416, 350, 417, 438, 351, 418, 419, 361, + 420, 421, 194, 981, 362, 351, 362, 701, 318, 362, + 973, 1254, 115, 1237, 115, 906, 351, 472, 231, 352, + 1150, 562, 933, 318, 970, 1066, 494, 933, 318, 933, + 352, 677, 933, 933, 962, 933, 933, 1012, 588, 1015, + 570, 332, 866, 995, 570, 1017, 1046, 571, 589, 690, + 998, 571, 666, 1066, 562, 836, 1182, 94, 115, 572, + 1006, 115, 744, 572, 438, 360, 1356, 835, 935, 1433, + 1026, 1111, 249, 935, 365, 935, 929, 650, 935, 935, + 666, 935, 935, 1112, 761, 373, 1157, 1158, 94, 666, + 663, 478, 400, 366, 367, 1279, 1027, 1209, 1050, 663, + 270, 270, 662, 821, 1028, 821, 194, 1055, 821, 270, + 751, 662, 933, 368, 1302, 414, 751, 402, 751, 772, + 1045, 250, 1302, 772, 369, 772, 756, 772, 194, 401, + 756, 1486, 452, 1271, 756, 693, 403, 677, 498, 694, + 1166, 335, 761, 335, 498, 1052, 761, 1053, 761, 1054, + 761, 335, 744, 755, 335, 498, 727, 406, 935, 929, + 728, 755, 335, 335, 929, 297, 929, 736, 1506, 929, + 929, 509, 929, 929, 440, 877, 280, 522, 280, 878, + 1524, 1525, 335, 280, 357, 947, 948, 473, 820, 786, + 335, 824, 820, 335, 821, 824, 821, 821, 415, 1097, + 751, 225, 751, 416, 751, 417, 444, 357, 418, 419, + 44, 420, 421, 447, 168, 65, 168, 194, 168, 65, + 357, 113, 755, 474, 1104, 357, 755, 181, 232, 181, + 357, 181, 357, 357, 357, 357, 478, 335, 194, 494, + 357, 701, 335, 335, 357, 335, 335, 56, 357, 929, + 385, 386, 387, 1129, 744, 786, 357, 328, 475, 357, + 328, 357, 225, 113, 228, 1045, 296, 113, 297, 1133, + 1134, 233, 494, 1169, 1140, 494, 435, 625, 626, 627, + 628, 1024, 1102, 814, 1103, 357, 975, 115, 975, 1157, + 1158, 329, 329, 821, 763, 496, 763, 233, 561, 1165, + 563, 156, 435, 156, 194, 497, 163, 973, 163, 340, + 518, 494, 329, 340, 362, 335, 340, 164, 340, 164, + 886, 542, 886, 340, 547, 821, 1097, 194, 1169, 67, + 561, 67, 563, 187, 157, 187, 157, 1496, 1497, 437, + 555, 357, 194, 120, 523, 120, 194, 1275, 231, 1235, + 1253, 285, 1231, 285, 1236, 581, 127, 340, 127, 351, + 444, 113, 1347, 561, 292, 563, 292, 522, 522, 821, + 1235, 640, 640, 1145, 1146, 1236, 1347, 623, 624, 629, + 630, 526, 582, 590, 351, 653, 821, 672, 494, 355, + 258, 692, 656, 695, 1378, 1253, 1379, 1235, 697, 719, + 1286, 194, 1236, 329, 329, 725, 726, 748, 1231, 772, + 765, 115, 774, 775, 776, 115, 777, 794, 115, 194, + 194, 795, 797, 809, 258, 1310, 1311, 810, 258, 258, + 258, 258, 258, 258, 258, 258, 814, 823, 825, 829, + 845, 846, 115, 438, 1307, 852, 848, 115, 1339, 262, + 849, 1342, 42, 286, 287, 288, 864, 294, 295, 870, + 871, 899, 308, 309, 872, 873, 329, 879, 895, 315, + 196, 317, 900, 321, 902, 907, 911, 920, 333, 334, + 115, 701, 912, 926, 937, 942, 194, 944, 949, 957, + 113, 951, 329, 958, 961, 1357, 115, 960, 963, 966, + 968, 986, 370, 974, 329, 987, 990, 194, 996, 1003, + 701, 701, 329, 701, 512, 194, 1413, 1010, 1021, 1022, + 499, 113, 1048, 413, 701, 413, 499, 701, 1035, 1039, + 1056, 1062, 1063, 1440, 1072, 1074, 1064, 1092, 1084, 1088, + 1091, 1094, 701, 113, 413, 413, 1452, 1454, 1106, 1110, + 1113, 1114, 1115, 1132, 1116, 329, 1118, 744, 329, 1307, + 1122, 1119, 1135, 1176, 413, 1136, 701, 1148, 1161, 494, + 1190, 1143, 413, 1440, 1440, 413, 1193, 1168, 1208, 1195, + 1213, 1197, 1200, 1205, 1218, 1209, 1462, 1219, 356, 1222, + 1220, 1226, 329, 329, 1267, 1270, 1272, 1276, 1317, 338, + 1273, 1283, 1309, 341, 342, 343, 344, 345, 346, 347, + 348, 356, 1288, 1330, 1362, 1352, 1396, 258, 1334, 744, + 329, 329, 1345, 1364, 356, 1367, 1365, 258, 1369, 356, + 1440, 1335, 231, 258, 356, 1373, 356, 356, 356, 356, + 1371, 1375, 315, 1376, 356, 370, 1381, 1386, 356, 478, + 478, 1389, 356, 1344, 1353, 1355, 744, 1392, 1404, 1393, + 356, 1394, 1408, 356, 1405, 356, 1511, 1511, 1418, 1423, + 1437, 1425, 1438, 1520, 1520, 1435, 1434, 1444, 597, 597, + 1448, 1447, 1458, 1461, 1472, 1459, 516, 1463, 1464, 356, + 1466, 1478, 1479, 1483, 1487, 194, 113, 1498, 1488, 581, + 1482, 532, 1490, 1481, 258, 1504, 47, 1505, 1526, 1527, + 1528, 9, 971, 535, 604, 856, 258, 258, 258, 493, + 963, 258, 258, 494, 450, 605, 29, 21, 674, 47, + 492, 29, 27, 518, 30, 313, 329, 208, 30, 96, + 335, 765, 47, 864, 789, 356, 757, 47, 766, 825, + 758, 194, 47, 826, 47, 47, 47, 47, 329, 790, + 662, 827, 47, 113, 317, 685, 47, 829, 662, 194, + 342, 640, 640, 230, 123, 105, 288, 130, 47, 53, + 329, 47, 581, 47, 124, 106, 289, 581, 113, 581, + 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, + 131, 21, 1040, 956, 1285, 1480, 1138, 47, 338, 47, + 47, 581, 1139, 581, 1277, 581, 1449, 581, 581, 581, + 854, 1465, 1436, 1489, 1431, 194, 194, 1324, 867, 983, + 984, 1337, 985, 581, 194, 503, 1522, 1284, 550, 1281, + 1359, 979, 194, 194, 581, 194, 1514, 1460, 583, 1455, + 1453, 1327, 1513, 1214, 1380, 1328, 581, 1215, 952, 374, + 887, 931, 928, 1327, 762, 194, 808, 592, 194, 329, + 1075, 1002, 581, 863, 299, 709, 1327, 553, 632, 550, + 375, 376, 377, 378, 379, 380, 381, 382, 383, 384, + 329, 616, 617, 618, 631, 1327, 550, 550, 550, 550, + 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, + 550, 550, 258, 885, 633, 635, 752, 634, 636, 1202, + 925, 408, 1156, 779, 1289, 113, 1206, 113, 1117, 1068, + 1130, 583, 1087, 1123, 1125, 1187, 583, 755, 583, 583, + 583, 583, 583, 583, 583, 583, 583, 583, 583, 651, + 1019, 652, 1057, 833, 1287, 954, 329, 1192, 953, 0, + 583, 0, 583, 0, 583, 0, 583, 583, 583, 0, + 0, 113, 0, 0, 113, 0, 0, 0, 0, 329, + 0, 0, 583, 0, 0, 0, 0, 0, 27, 27, + 0, 0, 0, 27, 329, 0, 0, 27, 329, 27, + 0, 0, 27, 0, 27, 27, 34, 27, 0, 27, + 0, 27, 0, 27, 27, 27, 27, 0, 550, 27, + 27, 583, 0, 0, 0, 27, 0, 27, 27, 27, + 0, 0, 27, 27, 27, 0, 27, 0, 0, 27, + 0, 27, 27, 27, 27, 0, 0, 0, 27, 27, + 27, 0, 0, 27, 27, 27, 0, 258, 0, 0, + 0, 0, 27, 27, 0, 27, 27, 0, 27, 27, + 27, 329, 329, 0, 27, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 796, 0, 0, + 0, 503, 0, 0, 27, 33, 503, 503, 0, 0, + 27, 27, 0, 0, 0, 0, 0, 0, 0, 27, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 503, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 503, 503, 0, 0, 0, 503, 329, 0, + 503, 0, 503, 0, 503, 503, 503, 503, 0, 0, + 27, 0, 503, 0, 0, 0, 503, 0, 0, 0, + 503, 0, 0, 0, 0, 0, 0, 329, 503, 0, + 0, 503, 0, 503, 503, 0, 0, 0, 0, 503, + 0, 503, 503, 503, 503, 503, 503, 503, 503, 503, + 503, 503, 0, 0, 0, 0, 0, 503, 503, 0, + 113, 0, 503, 503, 0, 503, 503, 503, 503, 503, + 503, 503, 0, 503, 503, 0, 503, 503, 503, 503, + 503, 503, 503, 503, 503, 503, 0, 503, 503, 503, + 503, 503, 503, 503, 503, 503, 503, 503, 503, 503, + 503, 503, 503, 503, 503, 503, 503, 503, 503, 0, + 0, 503, 0, 503, 0, 503, 0, 858, 503, 0, + 0, 0, 0, 34, 503, 0, 0, 34, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 34, 0, + 0, 0, 0, 34, 0, 0, 0, 34, 0, 0, + 34, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 34, 34, 0, 0, 0, 34, 34, 0, + 0, 0, 0, 34, 0, 34, 34, 34, 34, 0, + 0, 0, 0, 34, 113, 0, 0, 34, 113, 34, + 0, 113, 0, 0, 0, 0, 0, 0, 0, 34, + 0, 34, 34, 0, 34, 0, 0, 329, 34, 0, + 0, 0, 33, 582, 0, 113, 33, 0, 0, 0, + 113, 0, 0, 0, 0, 0, 0, 33, 34, 0, + 0, 0, 33, 0, 34, 34, 33, 0, 0, 33, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 27, 0, 326, 0, 0, 0, 27, - 27, 0, 0, 113, 0, 0, 0, 113, 27, 203, - 204, 205, 206, 0, 207, 208, 209, 210, 211, 212, - 213, 214, 0, 0, 215, 216, 217, 218, 219, 220, - 221, 222, 0, 0, 0, 0, 0, 0, 33, 0, - 113, 0, 33, 0, 0, 0, 0, 0, 781, 27, - 326, 0, 0, 33, 0, 0, 113, 0, 33, 0, - 0, 0, 33, 0, 0, 33, 0, 0, 326, 0, - 0, 0, 0, 0, 0, 0, 545, 33, 33, 0, - 0, 0, 33, 33, 0, 0, 0, 0, 33, 0, - 33, 33, 33, 33, 0, 0, 0, 0, 33, 0, - 0, 0, 33, 0, 33, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 33, 0, 33, 33, 0, 33, - 0, 0, 0, 33, 326, 326, 0, 0, 0, 0, - 0, 0, 0, 326, 0, 0, 0, 852, 852, 0, - 0, 326, 326, 33, 326, 852, 852, 852, 852, 852, - 33, 852, 852, 0, 852, 852, 852, 852, 852, 852, - 852, 852, 0, 0, 326, 0, 852, 326, 852, 852, - 852, 852, 852, 852, 334, 0, 852, 0, 0, 0, - 852, 852, 0, 852, 852, 852, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 852, 0, 852, 0, 852, - 852, 0, 0, 852, 0, 852, 852, 852, 852, 852, - 852, 852, 852, 852, 852, 852, 852, 0, 852, 0, - 0, 852, 852, 0, 0, 852, 852, 0, 0, 0, + 0, 33, 33, 113, 0, 0, 33, 33, 0, 550, + 0, 0, 33, 329, 33, 33, 33, 33, 0, 113, + 0, 0, 33, 0, 0, 0, 33, 0, 33, 0, + 0, 329, 0, 0, 783, 0, 0, 0, 33, 0, + 33, 33, 0, 33, 0, 0, 582, 33, 0, 0, + 0, 582, 0, 582, 582, 582, 582, 582, 582, 582, + 582, 582, 582, 582, 0, 0, 0, 33, 0, 0, + 0, 0, 0, 0, 33, 582, 0, 582, 0, 582, + 0, 582, 582, 582, 0, 0, 0, 329, 329, 0, + 0, 0, 0, 0, 0, 0, 329, 582, 0, 0, + 0, 0, 0, 0, 329, 329, 0, 329, 582, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 852, 852, 852, 852, 852, 0, 0, 0, 852, 852, - 0, 0, 852, 0, 0, 0, 0, 852, 852, 852, - 852, 852, 0, 0, 0, 852, 0, 852, 0, 0, - 0, 0, 0, 852, 852, 0, 0, 0, 0, 0, + 582, 0, 0, 858, 858, 0, 0, 329, 0, 0, + 329, 858, 858, 858, 858, 858, 582, 858, 858, 0, + 858, 858, 858, 858, 858, 858, 858, 858, 0, 0, + 0, 0, 858, 0, 858, 858, 858, 858, 858, 858, + 335, 0, 858, 0, 0, 0, 858, 858, 0, 858, + 858, 858, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 858, 0, 858, 0, 858, 858, 0, 0, 858, + 0, 858, 858, 858, 858, 858, 858, 858, 858, 858, + 858, 858, 858, 0, 858, 0, 0, 858, 858, 0, + 0, 858, 858, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 858, 858, 858, 858, + 858, 0, 0, 0, 858, 858, 0, 0, 858, 0, + 0, 0, 0, 858, 858, 858, 858, 858, 0, 0, + 0, 858, 0, 858, 0, 0, 0, 0, 0, 858, + 858, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 852, 852, - 852, 852, 0, 852, 781, 781, 0, 0, 0, 0, - 852, 0, 781, 781, 781, 781, 781, 0, 781, 781, - 738, 781, 781, 781, 781, 781, 781, 781, 0, 0, - 0, 0, 0, 781, 0, 781, 781, 781, 781, 781, - 781, 0, 0, 781, 0, 0, 0, 781, 781, 0, - 781, 781, 781, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 781, 0, 781, 0, 781, 781, 0, 0, - 781, 0, 781, 781, 781, 781, 781, 781, 781, 781, - 781, 781, 781, 781, 0, 781, 0, 0, 781, 781, - 0, 0, 781, 781, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 781, 781, 781, - 781, 781, 0, 0, 0, 781, 781, 0, 0, 781, - 0, 0, 0, 0, 781, 781, 781, 781, 781, 0, - 334, 0, 781, 0, 781, 334, 334, 0, 0, 0, - 781, 781, 0, 0, 0, 0, 0, 0, 0, 0, - 327, 0, 0, 0, 0, 0, 0, 0, 334, 0, - 0, 0, 0, 0, 0, 781, 781, 781, 781, 0, - 781, 334, 334, 0, 0, 0, 334, 781, 0, 334, - 0, 334, 0, 334, 334, 334, 334, 0, 0, 0, - 0, 334, 0, 0, 0, 334, 0, 0, 0, 334, - 0, 0, 0, 0, 0, 0, 0, 334, 0, 0, - 334, 0, 334, 334, 0, 0, 0, 0, 334, 0, - 334, 334, 334, 334, 334, 334, 334, 334, 334, 334, - 334, 334, 0, 0, 0, 0, 334, 334, 0, 0, - 0, 334, 334, 334, 334, 334, 334, 334, 334, 334, - 334, 0, 334, 334, 0, 0, 334, 334, 334, 334, - 334, 0, 0, 334, 334, 0, 0, 0, 334, 334, - 334, 334, 334, 334, 334, 334, 738, 0, 0, 0, - 364, 738, 738, 0, 0, 0, 0, 334, 0, 0, - 334, 0, 334, 0, 334, 0, 0, 334, 0, 0, - 0, 0, 0, 334, 738, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 738, 738, 0, - 0, 0, 738, 0, 0, 738, 0, 738, 0, 738, - 738, 738, 738, 0, 0, 0, 0, 738, 0, 0, - 0, 738, 0, 0, 0, 738, 0, 0, 0, 0, - 0, 0, 0, 738, 0, 0, 738, 0, 738, 738, - 0, 0, 0, 0, 738, 0, 738, 738, 738, 738, - 738, 738, 738, 738, 738, 738, 738, 0, 0, 0, - 0, 0, 738, 738, 359, 0, 0, 738, 738, 738, - 738, 738, 738, 0, 738, 738, 738, 0, 738, 738, - 0, 0, 738, 738, 738, 738, 327, 0, 0, 738, - 738, 327, 327, 0, 738, 738, 738, 738, 738, 738, - 738, 738, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 738, 327, 0, 738, 0, 738, 0, - 738, 0, 0, 738, 0, 0, 0, 327, 327, 738, - 0, 0, 327, 0, 0, 327, 0, 327, 0, 327, - 327, 327, 327, 0, 0, 0, 0, 327, 0, 0, - 0, 327, 0, 0, 0, 327, 0, 0, 0, 0, - 0, 0, 0, 327, 0, 0, 327, 0, 327, 327, - 0, 0, 0, 0, 327, 0, 327, 327, 327, 327, - 327, 327, 327, 327, 327, 327, 327, 0, 0, 0, - 0, 0, 327, 327, 34, 0, 0, 327, 327, 327, - 327, 327, 327, 0, 327, 327, 327, 0, 327, 327, - 0, 0, 327, 327, 327, 327, 364, 0, 0, 327, - 327, 364, 364, 0, 327, 327, 327, 327, 327, 327, - 327, 327, 0, 0, 0, 0, 0, 32, 0, 0, - 0, 0, 0, 327, 364, 0, 327, 0, 327, 0, - 327, 0, 0, 327, 0, 0, 0, 364, 364, 327, - 0, 0, 364, 0, 0, 364, 0, 364, 0, 364, - 364, 364, 364, 0, 0, 0, 0, 364, 0, 0, - 27, 364, 0, 0, 0, 364, 0, 0, 0, 0, - 0, 0, 0, 364, 0, 0, 364, 0, 364, 364, - 0, 0, 0, 0, 364, 0, 364, 364, 364, 364, - 364, 364, 364, 364, 364, 364, 364, 0, 0, 0, - 359, 0, 364, 364, 0, 0, 359, 364, 364, 0, - 364, 364, 364, 0, 364, 364, 364, 0, 364, 364, - 0, 0, 364, 364, 364, 364, 0, 0, 0, 364, - 364, 0, 0, 0, 364, 364, 364, 364, 364, 364, - 364, 364, 359, 31, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 364, 0, 0, 364, 0, 364, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 364, + 0, 0, 0, 0, 858, 858, 858, 858, 0, 858, + 783, 783, 0, 0, 0, 0, 858, 0, 783, 783, + 783, 783, 783, 0, 783, 783, 740, 783, 783, 783, + 783, 783, 783, 783, 0, 0, 0, 0, 0, 783, + 0, 783, 783, 783, 783, 783, 783, 0, 0, 783, + 0, 0, 0, 783, 783, 0, 783, 783, 783, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 783, 0, + 783, 0, 783, 783, 0, 0, 783, 0, 783, 783, + 783, 783, 783, 783, 783, 783, 783, 783, 783, 783, + 0, 783, 0, 0, 783, 783, 0, 0, 783, 783, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 359, 0, 0, 947, 0, 359, 0, - 359, 359, 359, 359, 359, 359, 359, 359, 359, 359, - 359, 0, 0, 0, 0, 0, 0, 359, 0, 0, - 0, 359, 359, 0, 359, 359, 359, 0, 359, 359, - 359, 0, 359, 359, 0, 0, 359, 359, 359, 359, - 0, 34, 0, 359, 359, 34, 0, 0, 359, 359, - 359, 359, 359, 359, 359, 359, 34, 0, 0, 47, - 0, 34, 0, 0, 0, 34, 0, 359, 34, 0, - 359, 0, 359, 0, 0, 0, 0, 0, 0, 0, - 34, 34, 0, 359, 32, 34, 34, 0, 32, 0, - 0, 34, 0, 34, 34, 34, 34, 0, 0, 32, - 0, 34, 7, 0, 32, 34, 0, 34, 32, 0, - 0, 32, 0, 0, 0, 0, 0, 34, 0, 34, - 34, 0, 34, 32, 32, 0, 34, 27, 32, 32, - 0, 27, 0, 0, 32, 0, 32, 32, 32, 32, - 0, 0, 27, 0, 32, 948, 34, 27, 32, 0, - 32, 27, 34, 34, 27, 0, 0, 0, 0, 0, - 32, 0, 0, 32, 0, 32, 27, 27, 0, 32, - 0, 27, 27, 0, 0, 0, 0, 27, 0, 27, - 27, 27, 27, 0, 0, 0, 0, 27, 48, 32, - 0, 27, 0, 27, 0, 32, 32, 0, 0, 0, - 0, 0, 0, 27, 0, 0, 27, 0, 27, 0, - 31, 0, 27, 0, 31, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 31, 0, 0, 0, 0, - 31, 0, 27, 0, 31, 0, 0, 31, 27, 27, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 31, - 31, 0, 0, 947, 31, 31, 0, 47, 0, 0, - 31, 0, 31, 31, 31, 31, 0, 0, 47, 0, - 31, 0, 0, 47, 31, 0, 31, 47, 0, 0, - 47, 0, 0, 0, 0, 0, 31, 0, 0, 31, - 0, 31, 47, 47, 0, 31, 0, 47, 47, 0, - 0, 0, 0, 47, 0, 47, 47, 47, 47, 0, - 0, 0, 0, 47, 0, 31, 47, 47, 0, 47, - 47, 0, 31, 0, 0, 0, 0, 0, 0, 47, - 0, 47, 47, 0, 47, 0, 47, 0, 47, 0, - 47, 0, 0, 47, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 47, 47, 0, 47, 7, - 47, 47, 0, 48, 0, 0, 47, 0, 47, 47, - 47, 47, 0, 0, 48, 0, 47, 0, 0, 48, - 47, 0, 47, 48, 0, 0, 48, 0, 0, 0, - 0, 0, 47, 0, 0, 47, 0, 47, 48, 48, - 0, 47, 948, 48, 48, 0, 47, 0, 0, 48, - 0, 48, 48, 48, 48, 0, 0, 47, 0, 48, - 0, 47, 47, 48, 0, 48, 47, 0, 0, 47, - 0, 0, 0, 0, 0, 48, 0, 0, 48, 0, - 48, 47, 47, 0, 48, 48, 47, 47, 0, 48, + 0, 0, 0, 783, 783, 783, 783, 783, 0, 0, + 0, 783, 783, 0, 0, 783, 0, 0, 0, 0, + 783, 783, 783, 783, 783, 0, 335, 0, 783, 0, + 783, 335, 335, 0, 0, 0, 783, 783, 0, 0, + 0, 0, 0, 0, 0, 0, 328, 0, 0, 0, + 0, 0, 0, 0, 335, 0, 0, 0, 0, 0, + 0, 783, 783, 783, 783, 0, 783, 335, 335, 0, + 0, 0, 335, 783, 0, 335, 0, 335, 0, 335, + 335, 335, 335, 0, 0, 0, 0, 335, 0, 0, + 0, 335, 0, 0, 0, 335, 0, 0, 0, 0, + 0, 0, 0, 335, 0, 0, 335, 0, 335, 335, + 0, 0, 0, 0, 335, 0, 335, 335, 335, 335, + 335, 335, 335, 335, 335, 335, 335, 335, 0, 0, + 0, 0, 335, 335, 0, 0, 0, 335, 335, 335, + 335, 335, 335, 335, 335, 335, 335, 0, 335, 335, + 0, 0, 335, 335, 335, 335, 335, 0, 0, 335, + 335, 0, 0, 0, 335, 335, 335, 335, 335, 335, + 335, 335, 740, 0, 0, 0, 365, 740, 740, 0, + 0, 0, 0, 335, 0, 0, 335, 0, 335, 0, + 335, 0, 0, 335, 0, 0, 0, 0, 0, 335, + 740, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 740, 740, 0, 0, 0, 740, 0, + 0, 740, 0, 740, 0, 740, 740, 740, 740, 0, + 0, 0, 0, 740, 0, 0, 0, 740, 0, 0, + 0, 740, 0, 0, 0, 0, 0, 0, 0, 740, + 0, 0, 740, 0, 740, 740, 0, 0, 0, 0, + 740, 0, 740, 740, 740, 740, 740, 740, 740, 740, + 740, 740, 740, 0, 0, 0, 0, 0, 740, 740, + 335, 0, 0, 740, 740, 740, 740, 740, 740, 0, + 740, 740, 740, 0, 740, 740, 0, 0, 740, 740, + 740, 740, 328, 0, 0, 740, 740, 328, 328, 0, + 740, 740, 740, 740, 740, 740, 740, 740, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 740, + 328, 0, 740, 0, 740, 0, 740, 0, 0, 740, + 0, 0, 0, 328, 328, 740, 0, 0, 328, 0, + 0, 328, 0, 328, 0, 328, 328, 328, 328, 0, + 0, 0, 0, 328, 0, 0, 0, 328, 0, 0, + 0, 328, 0, 0, 0, 0, 0, 0, 0, 328, + 0, 0, 328, 0, 328, 328, 0, 0, 0, 0, + 328, 0, 328, 328, 328, 328, 328, 328, 328, 328, + 328, 328, 328, 0, 0, 0, 0, 0, 328, 328, + 0, 0, 0, 328, 328, 328, 328, 328, 328, 0, + 328, 328, 328, 0, 328, 328, 360, 0, 328, 328, + 328, 328, 365, 0, 0, 328, 328, 365, 365, 0, + 328, 328, 328, 328, 328, 328, 328, 328, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 328, + 365, 0, 328, 0, 328, 0, 328, 0, 0, 328, + 0, 0, 0, 365, 365, 328, 0, 0, 365, 0, + 0, 365, 0, 365, 0, 365, 365, 365, 365, 0, + 0, 0, 0, 365, 0, 0, 0, 365, 0, 0, + 0, 365, 0, 0, 0, 0, 0, 0, 0, 365, + 0, 0, 365, 0, 365, 365, 0, 0, 0, 0, + 365, 0, 365, 365, 365, 365, 365, 365, 365, 365, + 365, 365, 365, 0, 0, 0, 335, 0, 365, 365, + 0, 0, 335, 365, 365, 0, 365, 365, 365, 0, + 365, 365, 365, 0, 365, 365, 32, 0, 365, 365, + 365, 365, 0, 0, 0, 365, 365, 0, 0, 0, + 365, 365, 365, 365, 365, 365, 365, 365, 335, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 365, + 0, 0, 365, 0, 365, 0, 0, 0, 0, 27, + 0, 0, 0, 0, 0, 365, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 335, + 0, 0, 585, 0, 335, 0, 335, 335, 335, 335, + 335, 335, 335, 335, 335, 335, 335, 335, 0, 0, + 0, 0, 31, 335, 0, 0, 0, 335, 335, 335, + 335, 335, 335, 335, 335, 335, 335, 0, 335, 335, + 0, 0, 335, 335, 335, 335, 335, 0, 0, 335, + 335, 0, 0, 0, 335, 335, 335, 335, 335, 335, + 335, 335, 360, 0, 0, 5, 0, 0, 360, 0, + 0, 0, 0, 335, 0, 0, 335, 0, 335, 0, + 335, 0, 0, 335, 0, 585, 0, 0, 0, 335, + 585, 0, 585, 585, 585, 585, 585, 585, 585, 585, + 585, 585, 585, 0, 360, 0, 0, 0, 953, 0, + 0, 0, 0, 0, 585, 0, 585, 0, 585, 0, + 585, 585, 585, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 360, 0, 0, 0, 0, + 360, 47, 360, 360, 360, 360, 360, 360, 360, 360, + 360, 360, 360, 0, 0, 0, 0, 0, 0, 360, + 0, 0, 0, 360, 360, 585, 360, 360, 360, 0, + 360, 360, 360, 0, 360, 360, 0, 0, 360, 360, + 360, 360, 0, 32, 7, 360, 360, 32, 0, 0, + 360, 360, 360, 360, 360, 360, 360, 360, 32, 0, + 0, 0, 0, 32, 0, 0, 0, 32, 0, 360, + 32, 0, 360, 0, 360, 0, 0, 0, 0, 0, + 0, 0, 32, 32, 0, 360, 27, 32, 32, 0, + 27, 0, 0, 32, 0, 32, 32, 32, 32, 0, + 0, 27, 0, 32, 0, 0, 27, 32, 0, 32, + 27, 954, 0, 27, 0, 0, 0, 0, 0, 32, + 0, 0, 32, 0, 32, 27, 27, 0, 32, 31, + 27, 27, 0, 31, 0, 0, 27, 0, 27, 27, + 27, 27, 0, 0, 31, 0, 27, 0, 32, 31, + 27, 0, 27, 31, 32, 32, 31, 0, 48, 0, + 0, 0, 27, 0, 0, 27, 0, 27, 31, 31, + 0, 27, 5, 31, 31, 0, 47, 0, 0, 31, + 0, 31, 31, 31, 31, 0, 0, 47, 0, 31, + 0, 27, 47, 31, 0, 31, 47, 27, 27, 47, + 0, 0, 0, 0, 0, 31, 0, 0, 31, 0, + 31, 47, 47, 0, 31, 953, 47, 47, 0, 47, 0, 0, 47, 0, 47, 47, 47, 47, 0, 0, - 48, 0, 47, 0, 48, 48, 47, 0, 47, 48, - 0, 0, 48, 0, 0, 0, 0, 0, 47, 0, - 0, 47, 0, 47, 48, 48, 0, 47, 0, 48, + 47, 0, 47, 0, 31, 47, 47, 0, 47, 47, + 0, 31, 47, 0, 0, 0, 0, 0, 47, 0, + 0, 47, 0, 47, 47, 47, 0, 47, 47, 47, + 47, 0, 47, 0, 0, 47, 0, 47, 47, 47, + 47, 0, 0, 47, 0, 47, 0, 47, 47, 47, + 0, 47, 47, 0, 0, 47, 0, 0, 0, 0, + 0, 47, 0, 0, 47, 0, 47, 47, 47, 0, + 47, 7, 47, 47, 0, 48, 0, 0, 47, 0, + 47, 47, 47, 47, 0, 0, 48, 0, 47, 0, + 47, 48, 47, 0, 47, 48, 0, 0, 48, 0, + 0, 0, 0, 0, 47, 0, 0, 47, 0, 47, + 48, 48, 0, 47, 0, 48, 48, 0, 0, 0, + 0, 48, 0, 48, 48, 48, 48, 0, 0, 0, + 0, 48, 0, 47, 0, 48, 0, 48, 954, 0, + 0, 0, 47, 0, 0, 0, 0, 48, 0, 0, + 48, 0, 48, 47, 0, 0, 48, 0, 47, 0, + 0, 0, 47, 0, 0, 47, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 48, 47, 47, 0, + 0, 0, 47, 47, 0, 48, 0, 0, 47, 48, + 47, 47, 47, 47, 0, 0, 0, 0, 47, 0, + 48, 0, 47, 0, 47, 48, 0, 0, 0, 48, + 0, 0, 48, 0, 47, 0, 0, 47, 0, 47, + 0, 0, 0, 47, 48, 48, 0, 0, 0, 48, 48, 0, 0, 0, 0, 48, 0, 48, 48, 48, - 48, 0, 0, 0, 0, 48, 0, 47, 0, 48, + 48, 0, 0, 47, 0, 48, 0, 0, 0, 48, 0, 48, 0, 0, 0, 0, 0, 0, 0, 0, 0, 48, 0, 55, 48, 0, 48, 0, 0, 0, 48, 56, 24, 57, 25, 0, 0, 26, 58, 0, @@ -10258,419 +10394,528 @@ void case_972() 0, 73, 0, 36, 0, 37, 74, 0, 0, 38, 0, 75, 76, 77, 78, 79, 80, 39, 40, 81, 82, 41, 83, 0, 84, 0, 0, 85, 86, 0, - 334, 87, 88, 0, 0, 0, 334, 0, 0, 0, + 335, 87, 88, 0, 0, 0, 335, 0, 0, 0, 0, 0, 0, 0, 0, 0, 89, 90, 91, 92, 93, 0, 0, 0, 94, 0, 0, 0, 95, 0, 0, 0, 0, 96, 97, 98, 99, 100, 0, 0, - 0, 101, 334, 102, 0, 0, 0, 0, 0, 103, + 0, 101, 335, 102, 0, 0, 0, 0, 0, 103, 104, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 334, 0, 0, 0, - 0, 0, 334, 0, 105, 106, 107, 108, 0, 0, - 0, 0, 0, 334, 0, 0, 196, 0, 334, 0, - 334, 334, 334, 334, 334, 334, 334, 334, 334, 334, - 334, 334, 0, 0, 0, 0, 0, 334, 334, 0, - 0, 0, 334, 334, 334, 334, 334, 334, 334, 334, - 334, 0, 334, 334, 0, 334, 334, 334, 334, 334, - 334, 334, 334, 334, 334, 0, 334, 334, 334, 334, - 334, 334, 334, 334, 334, 334, 334, 334, 334, 334, - 334, 334, 334, 334, 334, 334, 334, 334, 0, 504, - 0, 0, 334, 0, 334, 504, 0, 334, 0, 0, - 0, 0, 0, 334, 0, 0, 0, 0, 334, 0, - 0, 334, 0, 334, 334, 0, 0, 0, 334, 334, - 0, 0, 334, 334, 334, 334, 334, 334, 334, 334, - 334, 504, 334, 334, 334, 334, 334, 334, 334, 334, - 334, 334, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 334, 334, 0, 0, 0, 0, 0, 0, - 334, 0, 0, 334, 0, 0, 0, 0, 0, 334, - 0, 0, 504, 0, 0, 0, 0, 504, 0, 504, - 504, 504, 504, 504, 504, 504, 504, 504, 504, 504, + 0, 0, 0, 0, 0, 0, 335, 0, 0, 0, + 0, 0, 335, 0, 105, 106, 107, 108, 0, 0, + 0, 0, 0, 335, 0, 0, 196, 0, 335, 0, + 335, 335, 335, 335, 335, 335, 335, 335, 335, 335, + 335, 335, 0, 0, 0, 0, 0, 335, 335, 0, + 0, 0, 335, 335, 335, 335, 335, 335, 335, 335, + 335, 0, 335, 335, 0, 335, 335, 335, 335, 335, + 335, 335, 335, 335, 335, 0, 335, 335, 335, 335, + 335, 335, 335, 335, 335, 335, 335, 335, 335, 335, + 335, 335, 335, 335, 335, 335, 335, 335, 0, 505, + 0, 0, 335, 0, 335, 505, 0, 335, 0, 0, + 0, 0, 0, 335, 0, 0, 0, 0, 335, 0, + 0, 335, 0, 335, 335, 0, 0, 0, 335, 335, + 0, 0, 335, 335, 335, 335, 335, 335, 335, 335, + 335, 505, 335, 335, 335, 335, 335, 335, 335, 335, + 335, 335, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 335, 335, 0, 0, 0, 0, 0, 0, + 335, 0, 0, 335, 0, 0, 0, 0, 0, 335, + 0, 201, 505, 0, 0, 0, 0, 505, 0, 505, + 505, 505, 505, 505, 505, 505, 505, 505, 505, 505, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 504, 504, 504, 504, 504, 504, 504, 504, 504, 504, - 584, 504, 504, 0, 504, 504, 504, 504, 504, 504, - 504, 504, 504, 504, 0, 504, 504, 504, 504, 504, - 504, 504, 504, 504, 504, 504, 504, 504, 504, 504, - 504, 504, 504, 504, 504, 504, 504, 0, 500, 0, - 0, 0, 0, 504, 500, 0, 0, 0, 0, 0, - 0, 0, 504, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 500, 0, 0, 584, 0, 0, 0, 0, 584, 0, - 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, - 584, 0, 0, 0, 0, 0, 0, 0, 0, 390, - 0, 0, 584, 0, 584, 390, 584, 0, 584, 584, - 584, 500, 0, 0, 0, 0, 500, 0, 500, 500, - 500, 500, 500, 500, 500, 500, 500, 500, 500, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 500, - 500, 390, 500, 500, 500, 500, 500, 500, 500, 0, - 500, 500, 0, 500, 500, 500, 500, 500, 500, 500, - 500, 500, 500, 584, 500, 500, 500, 500, 500, 500, - 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, - 500, 500, 500, 500, 500, 500, 0, 508, 0, 0, - 0, 0, 500, 508, 0, 500, 0, 0, 0, 0, - 0, 500, 0, 0, 0, 0, 327, 0, 0, 0, - 0, 390, 327, 0, 390, 390, 390, 390, 0, 390, - 0, 390, 390, 0, 390, 390, 390, 390, 390, 508, - 390, 390, 390, 390, 0, 390, 390, 390, 390, 390, - 390, 390, 390, 390, 390, 390, 390, 390, 390, 390, - 390, 390, 390, 390, 390, 390, 390, 0, 0, 0, - 0, 327, 0, 390, 0, 0, 390, 0, 0, 0, - 508, 0, 390, 0, 0, 508, 0, 508, 508, 508, - 508, 508, 508, 508, 508, 508, 508, 508, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 508, - 0, 508, 508, 508, 508, 508, 508, 508, 0, 508, - 508, 0, 508, 508, 508, 508, 508, 508, 508, 508, - 508, 508, 0, 508, 508, 508, 508, 508, 508, 508, - 508, 508, 508, 508, 508, 508, 508, 508, 508, 508, - 508, 508, 508, 508, 508, 0, 334, 747, 0, 0, - 0, 508, 334, 0, 508, 0, 24, 0, 25, 0, - 508, 26, 0, 0, 0, 0, 27, 0, 0, 0, + 505, 505, 505, 505, 505, 505, 505, 505, 505, 505, + 945, 505, 505, 202, 505, 505, 505, 505, 505, 505, + 505, 505, 505, 505, 0, 505, 505, 505, 505, 505, + 505, 505, 505, 505, 505, 505, 505, 505, 505, 505, + 505, 505, 505, 505, 505, 505, 505, 0, 501, 0, + 0, 0, 0, 505, 501, 0, 0, 0, 0, 0, + 0, 0, 505, 203, 204, 205, 206, 0, 207, 208, + 209, 210, 211, 212, 213, 214, 0, 0, 215, 216, + 217, 218, 219, 220, 221, 222, 0, 0, 0, 0, + 501, 0, 0, 945, 0, 0, 0, 0, 945, 0, + 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 391, + 0, 0, 945, 0, 945, 391, 945, 0, 945, 945, + 945, 501, 0, 0, 0, 0, 501, 0, 501, 501, + 501, 501, 501, 501, 501, 501, 501, 501, 501, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 501, + 501, 391, 501, 501, 501, 501, 501, 501, 501, 0, + 501, 501, 0, 501, 501, 501, 501, 501, 501, 501, + 501, 501, 501, 945, 501, 501, 501, 501, 501, 501, + 501, 501, 501, 501, 501, 501, 501, 501, 501, 501, + 501, 501, 501, 501, 501, 501, 0, 509, 0, 0, + 0, 0, 501, 509, 0, 501, 0, 0, 0, 0, + 0, 501, 0, 0, 0, 0, 328, 0, 0, 0, + 0, 391, 328, 0, 391, 391, 391, 391, 0, 391, + 0, 391, 391, 0, 391, 391, 391, 391, 391, 509, + 391, 391, 391, 391, 0, 391, 391, 391, 391, 391, + 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, + 391, 391, 391, 391, 391, 391, 391, 0, 0, 0, + 0, 328, 0, 391, 0, 0, 391, 0, 0, 0, + 509, 0, 391, 0, 0, 509, 0, 509, 509, 509, + 509, 509, 509, 509, 509, 509, 509, 509, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 509, + 0, 509, 509, 509, 509, 509, 509, 509, 0, 509, + 509, 0, 509, 509, 509, 509, 509, 509, 509, 509, + 509, 509, 0, 509, 509, 509, 509, 509, 509, 509, + 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, + 509, 509, 509, 509, 509, 0, 335, 756, 0, 0, + 0, 509, 335, 0, 509, 0, 24, 0, 25, 0, + 509, 26, 0, 0, 0, 0, 27, 0, 0, 0, 28, 0, 0, 0, 0, 0, 0, 0, 0, 30, - 0, 0, 0, 0, 0, 0, 32, 0, 334, 0, + 0, 0, 0, 0, 0, 0, 32, 0, 335, 0, 0, 33, 0, 0, 0, 34, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 36, 0, 37, 0, 0, 0, 38, 0, 0, 0, 0, 0, 0, - 0, 39, 40, 0, 0, 41, 0, 0, 748, 334, - 0, 0, 0, 0, 334, 0, 334, 334, 334, 334, - 334, 334, 334, 334, 334, 334, 334, 0, 0, 0, - 0, 0, 0, 0, 290, 0, 0, 0, 334, 0, - 334, 334, 334, 334, 334, 334, 334, 0, 334, 334, - 0, 334, 334, 334, 334, 334, 334, 334, 334, 334, - 334, 0, 334, 334, 334, 334, 334, 334, 334, 334, - 334, 334, 334, 334, 334, 334, 334, 334, 334, 334, - 334, 334, 334, 334, 0, 433, 562, 0, 0, 320, - 334, 433, 0, 334, 0, 24, 0, 25, 0, 334, + 0, 39, 40, 0, 0, 41, 0, 0, 757, 335, + 0, 0, 0, 0, 335, 0, 335, 335, 335, 335, + 335, 335, 335, 335, 335, 335, 335, 0, 0, 0, + 0, 0, 0, 0, 291, 0, 0, 0, 335, 0, + 335, 335, 335, 335, 335, 335, 335, 0, 335, 335, + 0, 335, 335, 335, 335, 335, 335, 335, 335, 335, + 335, 0, 335, 335, 335, 335, 335, 335, 335, 335, + 335, 335, 335, 335, 335, 335, 335, 335, 335, 335, + 335, 335, 335, 335, 0, 434, 567, 0, 0, 323, + 335, 434, 0, 335, 0, 24, 0, 25, 0, 335, 26, 0, 0, 0, 0, 27, 0, 0, 0, 28, 0, 0, 0, 0, 0, 0, 0, 0, 30, 0, - 0, 0, 0, 0, 0, 32, 0, 433, 0, 0, + 0, 0, 0, 0, 0, 32, 0, 434, 0, 0, 33, 0, 0, 0, 34, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 36, 0, 37, 0, 0, 0, 38, 0, 0, 0, 0, 0, 0, 0, - 39, 40, 0, 0, 41, 0, 0, 319, 433, 0, - 0, 0, 0, 433, 0, 433, 433, 433, 433, 433, - 433, 433, 433, 433, 433, 433, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 433, 0, 433, - 433, 433, 433, 433, 433, 433, 0, 433, 433, 0, - 433, 433, 433, 433, 433, 433, 433, 433, 433, 433, - 0, 433, 433, 433, 433, 433, 433, 433, 433, 433, - 433, 433, 433, 433, 433, 433, 433, 433, 433, 433, - 433, 433, 433, 0, 393, 0, 448, 0, 352, 433, - 393, 0, 433, 0, 0, 0, 0, 0, 433, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 449, + 39, 40, 0, 0, 41, 0, 0, 322, 434, 0, + 0, 0, 0, 434, 0, 434, 434, 434, 434, 434, + 434, 434, 434, 434, 434, 434, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 434, 0, 434, + 434, 434, 434, 434, 434, 434, 0, 434, 434, 0, + 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, + 0, 434, 434, 434, 434, 434, 434, 434, 434, 434, + 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, + 434, 434, 434, 0, 394, 0, 453, 0, 355, 434, + 394, 0, 434, 0, 0, 0, 0, 0, 434, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 454, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 455, 0, 0, 0, 394, 457, 0, 0, + 0, 0, 458, 0, 459, 460, 461, 462, 0, 0, + 0, 0, 463, 0, 0, 0, 464, 0, 0, 335, + 1320, 0, 0, 0, 0, 335, 0, 0, 465, 743, + 0, 466, 0, 467, 0, 0, 0, 394, 0, 0, + 0, 0, 394, 0, 394, 394, 394, 394, 394, 394, + 394, 394, 394, 394, 394, 0, 0, 468, 0, 0, + 0, 335, 0, 0, 0, 0, 394, 0, 394, 394, + 394, 394, 394, 394, 394, 0, 394, 743, 0, 394, + 394, 394, 394, 394, 394, 394, 394, 394, 394, 0, + 394, 394, 394, 394, 394, 394, 394, 394, 394, 394, + 394, 394, 394, 394, 394, 394, 394, 394, 394, 394, + 394, 394, 0, 1321, 0, 0, 0, 0, 394, 0, + 335, 394, 0, 0, 0, 0, 335, 394, 0, 0, + 0, 335, 335, 335, 335, 335, 335, 335, 743, 335, + 0, 335, 335, 0, 335, 335, 335, 335, 335, 335, + 335, 335, 335, 335, 0, 335, 335, 335, 335, 335, + 335, 335, 335, 335, 335, 335, 335, 335, 335, 335, + 335, 335, 335, 335, 335, 335, 335, 0, 540, 0, + 501, 335, 0, 335, 540, 0, 335, 0, 56, 24, + 0, 25, 335, 0, 26, 253, 0, 0, 0, 27, + 61, 62, 0, 28, 0, 0, 0, 0, 0, 64, + 0, 0, 30, 0, 0, 0, 0, 0, 0, 32, + 540, 0, 0, 0, 33, 0, 71, 72, 34, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 36, 0, 37, 74, 0, 0, 38, 0, 0, 76, + 0, 78, 0, 80, 39, 40, 254, 0, 41, 0, + 0, 540, 0, 0, 0, 0, 540, 0, 540, 540, + 540, 540, 540, 540, 540, 540, 540, 540, 540, 0, + 0, 0, 0, 89, 90, 91, 255, 0, 0, 0, + 540, 0, 540, 0, 540, 95, 540, 540, 540, 0, + 540, 540, 0, 540, 540, 540, 540, 540, 540, 540, + 540, 540, 540, 453, 0, 0, 540, 540, 540, 540, + 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, + 540, 540, 540, 540, 552, 540, 454, 0, 0, 0, + 552, 105, 502, 0, 0, 0, 0, 0, 0, 455, + 0, 540, 0, 0, 457, 0, 0, 0, 0, 458, + 0, 459, 460, 461, 462, 0, 0, 0, 0, 463, + 0, 0, 0, 464, 0, 0, 552, 0, 0, 0, + 0, 0, 0, 0, 0, 465, 0, 0, 466, 0, + 467, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 556, 0, 0, 0, 0, 0, 556, 0, + 0, 0, 0, 0, 468, 0, 0, 552, 0, 0, + 0, 0, 552, 0, 552, 552, 552, 552, 552, 552, + 552, 552, 552, 552, 552, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 556, 0, 552, 0, 552, 0, + 552, 0, 552, 552, 552, 0, 552, 552, 0, 0, + 552, 552, 552, 552, 552, 552, 552, 552, 552, 0, + 1335, 0, 552, 552, 552, 552, 552, 552, 552, 552, + 0, 0, 0, 0, 0, 556, 0, 0, 0, 0, + 556, 552, 556, 556, 556, 556, 556, 556, 556, 556, + 556, 556, 556, 0, 0, 0, 559, 552, 0, 0, + 0, 0, 559, 0, 556, 0, 556, 0, 556, 0, + 556, 556, 556, 0, 556, 556, 0, 0, 556, 556, + 556, 556, 0, 0, 0, 556, 556, 0, 0, 0, + 556, 556, 556, 556, 556, 556, 556, 556, 559, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 556, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 557, 556, 0, 0, 0, 0, + 557, 0, 0, 0, 0, 0, 0, 0, 0, 559, + 0, 0, 0, 0, 559, 0, 559, 559, 559, 559, + 559, 559, 559, 559, 559, 559, 559, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 557, 0, 559, 0, + 559, 0, 559, 0, 559, 559, 559, 0, 559, 559, + 0, 0, 559, 559, 559, 559, 0, 0, 0, 559, + 559, 0, 0, 0, 559, 559, 559, 559, 559, 559, + 559, 559, 0, 0, 0, 0, 0, 557, 0, 0, + 0, 0, 557, 559, 557, 557, 557, 557, 557, 557, + 557, 557, 557, 557, 557, 0, 0, 0, 558, 559, + 0, 0, 0, 0, 558, 0, 557, 0, 557, 0, + 557, 0, 557, 557, 557, 0, 557, 557, 0, 0, + 557, 557, 557, 557, 0, 0, 0, 557, 557, 0, + 0, 0, 557, 557, 557, 557, 557, 557, 557, 557, + 558, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 557, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 562, 557, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 450, 0, 0, 0, 393, 452, 0, 0, - 0, 0, 453, 0, 454, 455, 456, 457, 0, 0, - 0, 0, 458, 0, 0, 0, 459, 0, 0, 334, - 0, 0, 0, 0, 0, 334, 0, 0, 460, 741, - 0, 461, 0, 462, 0, 0, 0, 393, 0, 0, - 0, 0, 393, 0, 393, 393, 393, 393, 393, 393, - 393, 393, 393, 393, 393, 0, 0, 463, 0, 0, - 0, 334, 0, 0, 0, 0, 393, 0, 393, 393, - 393, 393, 393, 393, 393, 0, 393, 741, 0, 393, - 393, 393, 393, 393, 393, 393, 393, 393, 393, 0, - 393, 393, 393, 393, 393, 393, 393, 393, 393, 393, - 393, 393, 393, 393, 393, 393, 393, 393, 393, 393, - 393, 393, 582, 1325, 0, 0, 0, 0, 393, 0, - 334, 393, 0, 0, 0, 0, 334, 393, 0, 0, - 0, 334, 334, 334, 334, 334, 334, 334, 741, 334, - 0, 334, 334, 0, 334, 334, 334, 334, 334, 334, - 334, 334, 334, 334, 0, 334, 334, 334, 334, 334, - 334, 334, 334, 334, 334, 334, 334, 334, 334, 334, - 334, 334, 334, 334, 334, 334, 334, 0, 539, 0, - 0, 334, 0, 334, 539, 0, 334, 0, 0, 0, - 0, 0, 334, 0, 0, 582, 0, 0, 0, 0, - 582, 0, 582, 582, 582, 582, 582, 582, 582, 582, - 582, 582, 582, 0, 0, 0, 0, 0, 0, 0, - 539, 0, 0, 0, 582, 0, 582, 0, 582, 0, - 582, 582, 582, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 582, 0, 0, 0, + 0, 558, 0, 0, 0, 0, 558, 0, 558, 558, + 558, 558, 558, 558, 558, 558, 558, 558, 558, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 539, 0, 0, 0, 0, 539, 0, 539, 539, - 539, 539, 539, 539, 539, 539, 539, 539, 539, 0, - 0, 0, 0, 0, 0, 582, 0, 0, 0, 0, - 539, 0, 539, 0, 539, 0, 539, 539, 539, 0, - 539, 539, 0, 539, 539, 539, 539, 539, 539, 539, - 539, 539, 539, 0, 0, 0, 539, 539, 539, 539, - 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, - 539, 539, 539, 539, 551, 539, 0, 0, 0, 0, - 551, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 24, 539, 25, 0, 0, 26, 0, 0, 0, 0, - 27, 0, 0, 0, 28, 0, 0, 0, 29, 0, - 0, 0, 0, 30, 0, 0, 551, 0, 31, 0, - 32, 0, 0, 0, 0, 33, 0, 0, 0, 34, - 35, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 36, 555, 37, 0, 0, 0, 38, 555, 0, - 0, 0, 0, 0, 0, 39, 40, 551, 0, 41, - 0, 0, 551, 0, 551, 551, 551, 551, 551, 551, - 551, 551, 551, 551, 551, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 555, 0, 551, 0, 551, 0, - 551, 0, 551, 551, 551, 0, 551, 551, 0, 0, - 551, 551, 551, 551, 551, 551, 551, 551, 551, 0, - 0, 0, 551, 551, 551, 551, 551, 551, 551, 551, - 0, 0, 0, 0, 0, 555, 0, 0, 0, 0, - 555, 551, 555, 555, 555, 555, 555, 555, 555, 555, - 555, 555, 555, 42, 0, 0, 558, 551, 0, 0, - 0, 0, 558, 0, 555, 0, 555, 0, 555, 0, - 555, 555, 555, 0, 555, 555, 0, 0, 555, 555, - 555, 555, 0, 0, 0, 555, 555, 0, 0, 0, - 555, 555, 555, 555, 555, 555, 555, 555, 558, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 555, + 558, 0, 558, 0, 558, 0, 558, 558, 558, 0, + 558, 558, 0, 0, 558, 558, 558, 558, 0, 0, + 0, 558, 558, 0, 563, 0, 558, 558, 558, 558, + 558, 558, 558, 558, 0, 0, 0, 0, 0, 562, + 0, 0, 0, 0, 562, 558, 562, 562, 562, 562, + 562, 562, 562, 562, 562, 562, 562, 0, 0, 0, + 0, 558, 0, 0, 0, 0, 0, 0, 562, 0, + 562, 0, 562, 0, 562, 562, 562, 0, 0, 0, + 0, 0, 562, 562, 562, 562, 0, 0, 0, 562, + 562, 0, 564, 0, 562, 562, 562, 562, 562, 562, + 562, 562, 0, 0, 0, 0, 0, 563, 0, 0, + 0, 0, 563, 562, 563, 563, 563, 563, 563, 563, + 563, 563, 563, 563, 563, 0, 0, 0, 0, 562, + 0, 0, 0, 0, 0, 0, 563, 0, 563, 0, + 563, 0, 563, 563, 563, 0, 0, 0, 0, 0, + 563, 563, 563, 563, 0, 0, 0, 563, 563, 0, + 565, 0, 563, 563, 563, 563, 563, 563, 563, 563, + 0, 0, 0, 0, 0, 564, 0, 0, 0, 0, + 564, 563, 564, 564, 564, 564, 564, 564, 564, 564, + 564, 564, 564, 0, 0, 0, 0, 563, 0, 0, + 0, 0, 0, 0, 564, 0, 564, 0, 564, 0, + 564, 564, 564, 0, 0, 0, 0, 0, 564, 564, + 564, 564, 0, 0, 0, 564, 564, 0, 566, 0, + 564, 564, 564, 564, 564, 564, 564, 564, 0, 0, + 0, 0, 0, 565, 0, 0, 0, 0, 565, 564, + 565, 565, 565, 565, 565, 565, 565, 565, 565, 565, + 565, 0, 0, 0, 0, 564, 0, 0, 0, 0, + 0, 0, 565, 0, 565, 0, 565, 0, 565, 565, + 565, 0, 0, 0, 0, 0, 565, 565, 565, 565, + 0, 0, 0, 565, 565, 0, 567, 0, 0, 0, + 565, 565, 565, 565, 565, 565, 0, 0, 0, 0, + 0, 566, 0, 0, 0, 0, 566, 565, 566, 566, + 566, 566, 566, 566, 566, 566, 566, 566, 566, 0, + 0, 0, 0, 565, 0, 0, 0, 0, 0, 0, + 566, 0, 566, 0, 566, 0, 566, 566, 566, 0, + 0, 0, 0, 0, 566, 566, 566, 566, 0, 0, + 0, 566, 566, 0, 568, 0, 0, 0, 566, 566, + 566, 566, 566, 566, 0, 0, 0, 0, 0, 567, + 0, 0, 0, 0, 567, 566, 567, 567, 567, 567, + 567, 567, 567, 567, 567, 567, 567, 0, 0, 0, + 0, 566, 0, 0, 0, 0, 0, 0, 567, 0, + 567, 0, 567, 0, 567, 567, 567, 0, 0, 0, + 0, 0, 567, 567, 567, 567, 0, 0, 0, 567, + 567, 0, 569, 0, 0, 0, 567, 567, 567, 567, + 567, 567, 0, 0, 0, 0, 0, 568, 0, 0, + 0, 0, 568, 567, 568, 568, 568, 568, 568, 568, + 568, 568, 568, 568, 568, 0, 0, 0, 0, 567, + 0, 0, 0, 0, 0, 0, 568, 0, 568, 0, + 568, 0, 568, 568, 568, 0, 0, 0, 0, 0, + 568, 568, 568, 568, 0, 0, 0, 568, 568, 0, + 570, 0, 0, 0, 568, 568, 568, 568, 568, 568, + 0, 0, 0, 0, 0, 569, 0, 0, 0, 0, + 569, 568, 569, 569, 569, 569, 569, 569, 569, 569, + 569, 569, 569, 0, 0, 0, 0, 568, 0, 0, + 0, 0, 0, 0, 569, 0, 569, 0, 569, 0, + 569, 569, 569, 0, 0, 0, 0, 0, 569, 569, + 569, 569, 0, 0, 0, 569, 569, 0, 571, 0, + 0, 0, 569, 569, 569, 569, 569, 569, 0, 0, + 0, 0, 0, 570, 0, 0, 0, 0, 570, 569, + 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, + 570, 0, 0, 0, 0, 569, 0, 0, 0, 0, + 0, 0, 570, 0, 570, 0, 570, 0, 570, 570, + 570, 0, 0, 0, 0, 0, 0, 0, 570, 570, + 0, 0, 0, 570, 570, 0, 572, 0, 0, 0, + 0, 0, 570, 570, 570, 570, 0, 0, 0, 0, + 0, 571, 0, 0, 0, 0, 571, 570, 571, 571, + 571, 571, 571, 571, 571, 571, 571, 571, 571, 0, + 0, 0, 0, 570, 0, 0, 0, 0, 0, 0, + 571, 0, 571, 0, 571, 0, 571, 571, 571, 0, + 0, 0, 0, 0, 0, 0, 571, 571, 0, 0, + 0, 571, 571, 0, 573, 0, 0, 0, 0, 0, + 571, 571, 571, 571, 0, 0, 0, 0, 0, 572, + 0, 0, 0, 0, 572, 571, 572, 572, 572, 572, + 572, 572, 572, 572, 572, 572, 572, 0, 0, 0, + 0, 571, 0, 0, 0, 0, 0, 0, 572, 0, + 572, 0, 572, 0, 572, 572, 572, 0, 0, 0, + 0, 0, 0, 0, 572, 572, 0, 0, 0, 572, + 572, 0, 574, 0, 0, 0, 0, 0, 572, 572, + 572, 572, 0, 0, 0, 0, 0, 573, 0, 0, + 0, 0, 573, 572, 573, 573, 573, 573, 573, 573, + 573, 573, 573, 573, 573, 0, 0, 0, 0, 572, + 0, 0, 0, 0, 0, 0, 573, 0, 573, 0, + 573, 0, 573, 573, 573, 0, 0, 0, 0, 0, + 0, 0, 573, 573, 0, 0, 0, 573, 573, 0, + 575, 0, 0, 0, 0, 0, 0, 0, 573, 573, + 0, 0, 0, 0, 0, 574, 0, 0, 0, 0, + 574, 573, 574, 574, 574, 574, 574, 574, 574, 574, + 574, 574, 574, 0, 0, 0, 0, 573, 0, 0, + 0, 0, 0, 0, 574, 0, 574, 0, 574, 0, + 574, 574, 574, 0, 0, 0, 0, 0, 0, 0, + 574, 574, 0, 0, 0, 574, 574, 0, 576, 0, + 0, 0, 0, 0, 0, 0, 574, 574, 0, 0, + 0, 0, 0, 575, 0, 0, 0, 0, 575, 574, + 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, + 575, 0, 0, 0, 0, 574, 0, 0, 0, 0, + 0, 0, 575, 0, 575, 0, 575, 0, 575, 575, + 575, 0, 0, 0, 0, 0, 0, 0, 0, 575, + 0, 0, 0, 575, 575, 0, 577, 0, 0, 0, + 0, 0, 0, 0, 575, 575, 0, 0, 0, 0, + 0, 576, 0, 0, 0, 0, 576, 575, 576, 576, + 576, 576, 576, 576, 576, 576, 576, 576, 576, 0, + 0, 0, 0, 575, 0, 0, 0, 0, 0, 0, + 576, 0, 576, 0, 576, 0, 576, 576, 576, 0, + 0, 0, 0, 0, 0, 0, 0, 576, 0, 0, + 0, 576, 576, 0, 578, 0, 0, 0, 0, 0, + 0, 0, 576, 576, 0, 0, 0, 0, 0, 577, + 0, 0, 0, 0, 577, 576, 577, 577, 577, 577, + 577, 577, 577, 577, 577, 577, 577, 0, 0, 0, + 0, 576, 0, 0, 0, 0, 0, 0, 577, 0, + 577, 0, 577, 0, 577, 577, 577, 0, 0, 0, + 0, 0, 0, 0, 0, 577, 0, 0, 0, 0, + 577, 0, 579, 0, 0, 0, 0, 0, 0, 0, + 577, 577, 0, 0, 0, 0, 0, 578, 0, 0, + 0, 0, 578, 577, 578, 578, 578, 578, 578, 578, + 578, 578, 578, 578, 578, 0, 0, 0, 0, 577, + 0, 0, 0, 0, 0, 0, 578, 0, 578, 0, + 578, 0, 578, 578, 578, 0, 0, 0, 0, 0, + 0, 0, 0, 578, 0, 0, 0, 0, 578, 0, + 580, 0, 0, 0, 0, 0, 0, 0, 578, 578, + 0, 0, 0, 0, 0, 579, 0, 0, 0, 0, + 579, 578, 579, 579, 579, 579, 579, 579, 579, 579, + 579, 579, 579, 0, 0, 0, 0, 578, 0, 0, + 0, 0, 0, 0, 579, 0, 579, 0, 579, 0, + 579, 579, 579, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 335, 579, 0, 0, 743, + 0, 0, 0, 0, 0, 0, 579, 579, 0, 0, + 0, 0, 0, 580, 0, 0, 0, 0, 580, 579, + 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, + 580, 335, 0, 0, 0, 579, 0, 0, 0, 0, + 0, 0, 580, 0, 580, 0, 580, 743, 580, 580, + 580, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 580, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 580, 580, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 580, 0, 0, + 335, 0, 0, 0, 0, 0, 335, 0, 0, 0, + 0, 335, 335, 580, 335, 0, 335, 0, 743, 335, + 0, 335, 335, 0, 335, 335, 335, 335, 335, 335, + 335, 335, 335, 335, 0, 335, 335, 335, 335, 335, + 335, 335, 335, 335, 335, 335, 335, 335, 335, 335, + 335, 335, 335, 335, 335, 335, 335, 0, 0, 55, + 0, 335, 0, 335, 0, 0, 335, 56, 24, 57, + 25, 0, 335, 26, 58, 0, 59, 60, 27, 61, + 62, 63, 28, 0, 0, 0, 0, 0, 64, 0, + 65, 30, 66, 67, 68, 69, 0, 0, 32, 0, + 0, 0, 70, 33, 0, 71, 72, 34, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 73, 0, 36, + 0, 37, 74, 0, 0, 38, 0, 75, 76, 77, + 78, 79, 80, 39, 40, 81, 82, 41, 83, 0, + 84, 0, 0, 85, 86, 0, 0, 87, 88, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 556, 555, 0, 0, 0, 0, - 556, 0, 0, 0, 0, 0, 0, 0, 0, 558, - 0, 0, 0, 0, 558, 0, 558, 558, 558, 558, - 558, 558, 558, 558, 558, 558, 558, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 556, 0, 558, 0, - 558, 0, 558, 0, 558, 558, 558, 0, 558, 558, - 0, 0, 558, 558, 558, 558, 0, 0, 0, 558, - 558, 0, 0, 0, 558, 558, 558, 558, 558, 558, - 558, 558, 0, 0, 0, 0, 0, 556, 0, 0, - 0, 0, 556, 558, 556, 556, 556, 556, 556, 556, - 556, 556, 556, 556, 556, 0, 0, 0, 557, 558, - 0, 0, 0, 0, 557, 0, 556, 0, 556, 0, - 556, 0, 556, 556, 556, 0, 556, 556, 0, 0, - 556, 556, 556, 556, 0, 0, 0, 556, 556, 0, - 0, 0, 556, 556, 556, 556, 556, 556, 556, 556, - 557, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 556, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 561, 556, 0, 0, + 0, 0, 89, 90, 91, 92, 93, 0, 0, 0, + 94, 0, 0, 0, 95, 0, 0, 0, 0, 96, + 97, 98, 99, 100, 0, 0, 0, 101, 0, 102, + 0, 0, 0, 0, 0, 103, 104, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 266, 0, 0, 0, + 105, 106, 107, 108, 56, 24, 57, 25, 0, 0, + 26, 58, 0, 59, 60, 27, 61, 62, 63, 28, + 0, 0, 0, 0, 0, 64, 0, 65, 30, 66, + 67, 68, 69, 0, 0, 32, 0, 0, 0, 70, + 33, 0, 71, 72, 34, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 73, 0, 36, 0, 37, 74, + 0, 0, 38, 0, 75, 76, 77, 78, 79, 80, + 39, 40, 81, 82, 41, 83, 0, 84, 0, 0, + 85, 86, 0, 0, 87, 88, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 89, + 90, 91, 92, 93, 0, 0, 0, 94, 0, 0, + 0, 95, 0, 0, 0, 0, 96, 97, 98, 99, + 100, 0, 0, 0, 101, 0, 102, 0, 0, 0, + 0, 0, 103, 104, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 556, 0, 0, 0, 105, 106, 107, + 108, 56, 24, 57, 25, 0, 0, 26, 58, 0, + 59, 60, 27, 61, 62, 63, 28, 0, 0, 0, + 0, 0, 64, 0, 65, 30, 66, 67, 68, 69, + 0, 0, 32, 0, 0, 0, 70, 33, 0, 71, + 72, 34, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 73, 0, 36, 0, 37, 74, 0, 0, 38, + 0, 75, 76, 77, 78, 79, 80, 39, 40, 81, + 82, 41, 83, 0, 84, 0, 0, 85, 86, 0, + 0, 87, 88, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 89, 90, 91, 92, + 93, 0, 0, 0, 94, 0, 0, 0, 95, 0, + 0, 0, 0, 96, 97, 98, 99, 100, 0, 0, + 0, 101, 0, 102, 0, 0, 0, 0, 0, 103, + 104, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 950, 0, 0, 0, 105, 557, 107, 108, 950, 950, + 950, 950, 0, 0, 950, 950, 0, 950, 950, 950, + 950, 950, 950, 950, 0, 0, 0, 0, 0, 950, + 0, 950, 950, 950, 950, 950, 950, 0, 0, 950, + 0, 0, 0, 950, 950, 0, 950, 950, 950, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 950, 0, + 950, 0, 950, 950, 0, 0, 950, 0, 950, 950, + 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, + 0, 950, 0, 0, 950, 950, 0, 0, 950, 950, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 557, 0, 0, 0, 0, 557, 0, 557, 557, - 557, 557, 557, 557, 557, 557, 557, 557, 557, 0, + 0, 0, 0, 950, 950, 950, 950, 950, 0, 0, + 0, 950, 0, 0, 0, 950, 0, 0, 0, 0, + 950, 950, 950, 950, 950, 0, 0, 0, 950, 0, + 950, 0, 0, 0, 0, 0, 950, 950, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 557, 0, 557, 0, 557, 0, 557, 557, 557, 0, - 557, 557, 0, 0, 557, 557, 557, 557, 0, 0, - 0, 557, 557, 0, 562, 0, 557, 557, 557, 557, - 557, 557, 557, 557, 0, 0, 0, 0, 0, 561, - 0, 0, 0, 0, 561, 557, 561, 561, 561, 561, - 561, 561, 561, 561, 561, 561, 561, 0, 0, 0, - 0, 557, 0, 0, 0, 0, 0, 0, 561, 0, - 561, 0, 561, 0, 561, 561, 561, 0, 0, 0, - 0, 0, 561, 561, 561, 561, 0, 0, 0, 561, - 561, 0, 563, 0, 561, 561, 561, 561, 561, 561, - 561, 561, 0, 0, 0, 0, 0, 562, 0, 0, - 0, 0, 562, 561, 562, 562, 562, 562, 562, 562, - 562, 562, 562, 562, 562, 0, 0, 0, 0, 561, - 0, 0, 0, 0, 0, 0, 562, 0, 562, 0, - 562, 0, 562, 562, 562, 0, 0, 0, 0, 0, - 562, 562, 562, 562, 0, 0, 0, 562, 562, 0, - 564, 0, 562, 562, 562, 562, 562, 562, 562, 562, - 0, 0, 0, 0, 0, 563, 0, 0, 0, 0, - 563, 562, 563, 563, 563, 563, 563, 563, 563, 563, - 563, 563, 563, 0, 0, 0, 0, 562, 0, 0, - 0, 0, 0, 0, 563, 0, 563, 0, 563, 0, - 563, 563, 563, 0, 0, 0, 0, 0, 563, 563, - 563, 563, 0, 0, 0, 563, 563, 0, 565, 0, - 563, 563, 563, 563, 563, 563, 563, 563, 0, 0, - 0, 0, 0, 564, 0, 0, 0, 0, 564, 563, - 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, - 564, 0, 0, 0, 0, 563, 0, 0, 0, 0, - 0, 0, 564, 0, 564, 0, 564, 0, 564, 564, - 564, 0, 0, 0, 0, 0, 564, 564, 564, 564, - 0, 0, 0, 564, 564, 0, 566, 0, 0, 0, - 564, 564, 564, 564, 564, 564, 0, 0, 0, 0, - 0, 565, 0, 0, 0, 0, 565, 564, 565, 565, - 565, 565, 565, 565, 565, 565, 565, 565, 565, 0, - 0, 0, 0, 564, 0, 0, 0, 0, 0, 0, - 565, 0, 565, 0, 565, 0, 565, 565, 565, 0, - 0, 0, 0, 0, 565, 565, 565, 565, 0, 0, - 0, 565, 565, 0, 567, 0, 0, 0, 565, 565, - 565, 565, 565, 565, 0, 0, 0, 0, 0, 566, - 0, 0, 0, 0, 566, 565, 566, 566, 566, 566, - 566, 566, 566, 566, 566, 566, 566, 0, 0, 0, - 0, 565, 0, 0, 0, 0, 0, 0, 566, 0, - 566, 0, 566, 0, 566, 566, 566, 0, 0, 0, - 0, 0, 566, 566, 566, 566, 0, 0, 0, 566, - 566, 0, 568, 0, 0, 0, 566, 566, 566, 566, - 566, 566, 0, 0, 0, 0, 0, 567, 0, 0, - 0, 0, 567, 566, 567, 567, 567, 567, 567, 567, - 567, 567, 567, 567, 567, 0, 0, 0, 0, 566, - 0, 0, 0, 0, 0, 0, 567, 0, 567, 0, - 567, 0, 567, 567, 567, 0, 0, 0, 0, 0, - 567, 567, 567, 567, 0, 0, 0, 567, 567, 0, - 569, 0, 0, 0, 567, 567, 567, 567, 567, 567, - 0, 0, 0, 0, 0, 568, 0, 0, 0, 0, - 568, 567, 568, 568, 568, 568, 568, 568, 568, 568, - 568, 568, 568, 0, 0, 0, 0, 567, 0, 0, - 0, 0, 0, 0, 568, 0, 568, 0, 568, 0, - 568, 568, 568, 0, 0, 0, 0, 0, 568, 568, - 568, 568, 0, 0, 0, 568, 568, 0, 570, 0, - 0, 0, 568, 568, 568, 568, 568, 568, 0, 0, - 0, 0, 0, 569, 0, 0, 0, 0, 569, 568, - 569, 569, 569, 569, 569, 569, 569, 569, 569, 569, - 569, 0, 0, 0, 0, 568, 0, 0, 0, 0, - 0, 0, 569, 0, 569, 0, 569, 0, 569, 569, - 569, 0, 0, 0, 0, 0, 0, 0, 569, 569, - 0, 0, 0, 569, 569, 0, 571, 0, 0, 0, - 0, 0, 569, 569, 569, 569, 0, 0, 0, 0, - 0, 570, 0, 0, 0, 0, 570, 569, 570, 570, - 570, 570, 570, 570, 570, 570, 570, 570, 570, 0, - 0, 0, 0, 569, 0, 0, 0, 0, 0, 0, - 570, 0, 570, 0, 570, 0, 570, 570, 570, 0, - 0, 0, 0, 0, 0, 0, 570, 570, 0, 0, - 0, 570, 570, 0, 572, 0, 0, 0, 0, 0, - 570, 570, 570, 570, 0, 0, 0, 0, 0, 571, - 0, 0, 0, 0, 571, 570, 571, 571, 571, 571, - 571, 571, 571, 571, 571, 571, 571, 0, 0, 0, - 0, 570, 0, 0, 0, 0, 0, 0, 571, 0, - 571, 0, 571, 0, 571, 571, 571, 0, 0, 0, - 0, 0, 0, 0, 571, 571, 0, 0, 0, 571, - 571, 0, 573, 0, 0, 0, 0, 0, 571, 571, - 571, 571, 0, 0, 0, 0, 0, 572, 0, 0, - 0, 0, 572, 571, 572, 572, 572, 572, 572, 572, - 572, 572, 572, 572, 572, 0, 0, 0, 0, 571, - 0, 0, 0, 0, 0, 0, 572, 0, 572, 0, - 572, 0, 572, 572, 572, 0, 0, 0, 0, 0, - 0, 0, 572, 572, 0, 0, 0, 572, 572, 0, - 574, 0, 0, 0, 0, 0, 0, 0, 572, 572, - 0, 0, 0, 0, 0, 573, 0, 0, 0, 0, - 573, 572, 573, 573, 573, 573, 573, 573, 573, 573, - 573, 573, 573, 0, 0, 0, 0, 572, 0, 0, - 0, 0, 0, 0, 573, 0, 573, 0, 573, 0, - 573, 573, 573, 0, 0, 0, 0, 0, 0, 0, - 573, 573, 0, 0, 0, 573, 573, 0, 575, 0, - 0, 0, 0, 0, 0, 0, 573, 573, 0, 0, - 0, 0, 0, 574, 0, 0, 0, 0, 574, 573, - 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, - 574, 0, 0, 0, 0, 573, 0, 0, 0, 0, - 0, 0, 574, 0, 574, 0, 574, 0, 574, 574, - 574, 0, 0, 0, 0, 0, 0, 0, 0, 574, - 0, 0, 0, 574, 574, 0, 576, 0, 0, 0, - 0, 0, 0, 0, 574, 574, 0, 0, 0, 0, - 0, 575, 0, 0, 0, 0, 575, 574, 575, 575, - 575, 575, 575, 575, 575, 575, 575, 575, 575, 0, - 0, 0, 0, 574, 0, 0, 0, 0, 0, 0, - 575, 0, 575, 0, 575, 0, 575, 575, 575, 0, - 0, 0, 0, 0, 0, 0, 0, 575, 0, 0, - 0, 575, 575, 0, 577, 0, 0, 0, 0, 0, - 0, 0, 575, 575, 0, 0, 0, 0, 0, 576, - 0, 0, 0, 0, 576, 575, 576, 576, 576, 576, - 576, 576, 576, 576, 576, 576, 576, 0, 0, 0, - 0, 575, 0, 0, 0, 0, 0, 0, 576, 0, - 576, 0, 576, 0, 576, 576, 576, 0, 0, 0, - 0, 0, 0, 0, 0, 576, 0, 0, 0, 0, - 576, 0, 578, 0, 0, 0, 0, 0, 0, 0, - 576, 576, 0, 0, 0, 0, 0, 577, 0, 0, - 0, 0, 577, 576, 577, 577, 577, 577, 577, 577, - 577, 577, 577, 577, 577, 0, 0, 0, 0, 576, - 0, 0, 0, 0, 0, 0, 577, 0, 577, 0, - 577, 0, 577, 577, 577, 0, 0, 0, 0, 0, - 0, 0, 0, 577, 0, 0, 0, 0, 577, 0, - 579, 0, 0, 0, 0, 0, 0, 0, 577, 577, - 0, 0, 0, 0, 0, 578, 0, 0, 0, 0, - 578, 577, 578, 578, 578, 578, 578, 578, 578, 578, - 578, 578, 578, 0, 0, 0, 0, 577, 0, 0, - 0, 0, 0, 0, 578, 0, 578, 0, 578, 0, - 578, 578, 578, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 578, 0, 580, 0, - 0, 0, 0, 0, 0, 0, 578, 578, 0, 0, - 0, 0, 0, 579, 0, 0, 0, 0, 579, 578, - 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, - 579, 0, 0, 0, 0, 578, 0, 0, 0, 0, - 0, 0, 579, 0, 579, 0, 579, 0, 579, 579, - 579, 0, 0, 0, 581, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 579, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 579, 579, 0, 0, 0, 0, - 0, 580, 0, 0, 0, 0, 580, 579, 580, 580, - 580, 580, 580, 580, 580, 580, 580, 580, 580, 0, - 0, 0, 0, 579, 0, 0, 0, 0, 0, 0, - 580, 0, 580, 0, 580, 0, 580, 580, 580, 0, - 0, 0, 0, 334, 0, 0, 0, 741, 0, 0, - 0, 0, 580, 0, 0, 0, 0, 581, 0, 0, - 0, 0, 581, 580, 581, 581, 581, 581, 581, 581, - 581, 581, 581, 581, 581, 580, 0, 0, 0, 334, - 0, 0, 0, 0, 0, 0, 581, 0, 581, 0, - 581, 580, 581, 581, 581, 741, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 581, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 581, + 0, 0, 0, 0, 0, 0, 0, 794, 0, 0, + 0, 950, 950, 950, 950, 794, 794, 794, 794, 0, + 0, 794, 794, 0, 794, 794, 794, 794, 794, 794, + 794, 0, 0, 0, 0, 0, 794, 0, 794, 794, + 794, 794, 794, 794, 0, 0, 794, 0, 0, 0, + 794, 794, 0, 794, 794, 794, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 794, 0, 794, 0, 794, + 794, 0, 0, 794, 0, 794, 794, 794, 794, 794, + 794, 794, 794, 794, 794, 794, 794, 0, 794, 0, + 0, 794, 794, 0, 0, 794, 794, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 581, 0, 0, 0, 0, 0, 0, 334, 0, - 0, 0, 0, 0, 334, 0, 0, 581, 0, 334, - 334, 0, 334, 0, 334, 0, 741, 334, 0, 334, - 334, 0, 334, 334, 334, 334, 334, 334, 334, 334, - 334, 334, 0, 334, 334, 334, 334, 334, 334, 334, - 334, 334, 334, 334, 334, 334, 334, 334, 334, 334, - 334, 334, 334, 334, 334, 0, 0, 55, 0, 334, - 0, 334, 0, 0, 334, 56, 24, 57, 25, 0, - 334, 26, 58, 0, 59, 60, 27, 61, 62, 63, - 28, 0, 0, 0, 0, 0, 64, 0, 65, 30, - 66, 67, 68, 69, 0, 0, 32, 0, 0, 0, - 70, 33, 0, 71, 72, 34, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 73, 0, 36, 0, 37, - 74, 0, 0, 38, 0, 75, 76, 77, 78, 79, - 80, 39, 40, 81, 82, 41, 83, 0, 84, 0, - 0, 85, 86, 0, 0, 87, 88, 0, 0, 0, + 794, 794, 794, 794, 794, 0, 0, 0, 794, 0, + 0, 0, 794, 0, 0, 0, 0, 794, 794, 794, + 794, 794, 0, 0, 0, 794, 0, 794, 0, 0, + 0, 0, 0, 794, 794, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 742, 0, 0, 0, 794, 794, + 794, 794, 56, 24, 0, 25, 0, 0, 26, 253, + 0, 903, 0, 27, 61, 62, 0, 28, 0, 0, + 24, 0, 25, 64, 0, 26, 30, 0, 0, 0, + 27, 0, 0, 32, 28, 0, 0, 0, 33, 0, + 71, 72, 34, 30, 0, 0, 0, 0, 0, 0, + 32, 0, 0, 0, 36, 33, 37, 74, 0, 34, + 38, 0, 0, 76, 0, 78, 0, 80, 39, 40, + 254, 36, 41, 37, 0, 0, 0, 38, 0, 86, + 0, 0, 87, 88, 0, 39, 40, 0, 0, 41, + 0, 0, 322, 0, 0, 0, 0, 89, 90, 91, + 92, 302, 0, 0, 0, 518, 743, 0, 0, 95, + 0, 0, 0, 0, 0, 97, 98, 99, 100, 0, + 0, 0, 101, 0, 102, 0, 0, 0, 0, 0, + 103, 104, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 89, 90, 91, 92, 93, 0, 0, 0, 94, 0, - 0, 0, 95, 0, 0, 0, 0, 96, 97, 98, - 99, 100, 0, 0, 0, 101, 0, 102, 0, 0, - 0, 0, 0, 103, 104, 0, 0, 0, 0, 0, + 0, 929, 0, 0, 0, 105, 303, 107, 108, 56, + 24, 0, 25, 0, 0, 26, 253, 0, 1049, 0, + 27, 61, 62, 355, 28, 0, 0, 24, 0, 25, + 64, 0, 26, 30, 0, 0, 0, 27, 0, 0, + 32, 28, 0, 0, 0, 33, 0, 71, 72, 34, + 30, 593, 0, 0, 0, 0, 0, 32, 594, 0, + 0, 36, 33, 37, 74, 0, 34, 38, 0, 0, + 76, 0, 78, 0, 80, 39, 40, 254, 36, 41, + 37, 0, 0, 0, 38, 0, 595, 0, 0, 87, + 88, 0, 39, 40, 0, 0, 41, 0, 0, 322, + 0, 0, 0, 0, 89, 90, 91, 92, 93, 0, + 0, 0, 0, 0, 0, 0, 95, 0, 0, 0, + 0, 0, 97, 98, 99, 100, 0, 0, 0, 101, + 0, 102, 0, 0, 0, 0, 0, 103, 104, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 265, 0, 0, 0, 105, 106, - 107, 108, 56, 24, 57, 25, 0, 0, 26, 58, - 0, 59, 60, 27, 61, 62, 63, 28, 0, 0, - 0, 0, 0, 64, 0, 65, 30, 66, 67, 68, - 69, 0, 0, 32, 0, 0, 0, 70, 33, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 933, 0, + 0, 0, 105, 106, 107, 108, 56, 24, 0, 25, + 0, 0, 26, 253, 0, 0, 0, 27, 61, 62, + 355, 28, 0, 0, 174, 0, 174, 64, 0, 174, + 30, 0, 0, 0, 174, 0, 0, 32, 174, 0, + 0, 0, 33, 0, 71, 72, 34, 174, 0, 0, + 0, 0, 0, 0, 174, 0, 0, 0, 36, 174, + 37, 74, 934, 174, 38, 0, 0, 76, 0, 78, + 0, 80, 39, 40, 254, 174, 41, 174, 0, 0, + 0, 174, 0, 86, 0, 0, 87, 88, 0, 174, + 174, 0, 0, 174, 0, 0, 174, 0, 0, 0, + 0, 89, 90, 91, 92, 302, 0, 0, 0, 518, + 0, 0, 0, 95, 0, 0, 0, 0, 0, 97, + 98, 99, 100, 0, 0, 0, 101, 0, 102, 0, + 0, 974, 0, 0, 103, 104, 0, 0, 0, 0, + 0, 0, 56, 24, 0, 25, 0, 0, 26, 253, + 0, 0, 0, 27, 61, 62, 0, 28, 0, 105, + 303, 107, 108, 64, 0, 0, 30, 0, 0, 0, + 0, 0, 0, 32, 0, 0, 0, 174, 33, 0, 71, 72, 34, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 73, 0, 36, 0, 37, 74, 0, 0, - 38, 0, 75, 76, 77, 78, 79, 80, 39, 40, - 81, 82, 41, 83, 0, 84, 0, 0, 85, 86, + 0, 0, 0, 0, 36, 0, 37, 74, 0, 0, + 38, 0, 0, 76, 0, 78, 0, 80, 39, 40, + 254, 0, 41, 0, 0, 0, 0, 0, 0, 86, 0, 0, 87, 88, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 89, 90, 91, - 92, 93, 0, 0, 0, 94, 0, 0, 0, 95, - 0, 0, 0, 0, 96, 97, 98, 99, 100, 0, + 92, 302, 0, 0, 0, 729, 1001, 0, 0, 95, + 0, 0, 0, 0, 0, 97, 98, 99, 100, 0, 0, 0, 101, 0, 102, 0, 0, 0, 0, 0, 103, 104, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 551, 0, 0, 0, 105, 106, 107, 108, 56, - 24, 57, 25, 0, 0, 26, 58, 0, 59, 60, - 27, 61, 62, 63, 28, 0, 0, 0, 0, 0, - 64, 0, 65, 30, 66, 67, 68, 69, 0, 0, - 32, 0, 0, 0, 70, 33, 0, 71, 72, 34, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 73, - 0, 36, 0, 37, 74, 0, 0, 38, 0, 75, - 76, 77, 78, 79, 80, 39, 40, 81, 82, 41, - 83, 0, 84, 0, 0, 85, 86, 0, 0, 87, - 88, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 89, 90, 91, 92, 93, 0, - 0, 0, 94, 0, 0, 0, 95, 0, 0, 0, - 0, 96, 97, 98, 99, 100, 0, 0, 0, 101, - 0, 102, 0, 0, 0, 0, 0, 103, 104, 0, + 0, 0, 0, 742, 0, 105, 730, 107, 108, 0, + 0, 56, 24, 0, 25, 0, 731, 26, 253, 0, + 0, 0, 27, 61, 62, 0, 28, 0, 0, 174, + 0, 174, 64, 0, 174, 30, 0, 0, 0, 174, + 0, 0, 32, 174, 0, 0, 0, 33, 0, 71, + 72, 34, 174, 0, 0, 0, 0, 0, 0, 174, + 0, 0, 0, 36, 174, 37, 74, 934, 174, 38, + 0, 0, 76, 0, 78, 0, 80, 39, 40, 254, + 174, 41, 174, 0, 0, 0, 174, 0, 86, 0, + 0, 87, 88, 0, 174, 174, 0, 0, 174, 0, + 0, 174, 0, 0, 0, 0, 89, 90, 91, 92, + 302, 0, 0, 0, 518, 0, 0, 0, 95, 0, + 0, 0, 0, 0, 97, 98, 99, 100, 0, 0, + 0, 101, 0, 102, 974, 0, 0, 0, 0, 103, + 104, 0, 0, 0, 0, 0, 0, 56, 24, 0, + 25, 0, 0, 26, 253, 0, 0, 0, 27, 61, + 62, 0, 28, 0, 105, 303, 107, 108, 64, 0, + 0, 30, 0, 0, 0, 0, 0, 0, 32, 0, + 0, 0, 174, 33, 0, 71, 72, 34, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 36, + 0, 37, 74, 0, 0, 38, 0, 0, 76, 0, + 78, 0, 80, 39, 40, 254, 0, 41, 0, 0, + 0, 0, 0, 0, 86, 0, 0, 87, 88, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 944, 0, - 0, 0, 105, 552, 107, 108, 944, 944, 944, 944, - 0, 0, 944, 944, 0, 944, 944, 944, 944, 944, - 944, 944, 0, 0, 0, 0, 0, 944, 0, 944, - 944, 944, 944, 944, 944, 0, 0, 944, 0, 0, - 0, 944, 944, 0, 944, 944, 944, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 944, 0, 944, 0, - 944, 944, 0, 0, 944, 0, 944, 944, 944, 944, - 944, 944, 944, 944, 944, 944, 944, 944, 0, 944, - 0, 0, 944, 944, 0, 0, 944, 944, 0, 0, + 0, 0, 89, 90, 91, 92, 302, 0, 0, 0, + 729, 0, 0, 0, 95, 0, 0, 0, 0, 0, + 97, 98, 99, 100, 0, 0, 0, 101, 0, 102, + 0, 0, 0, 0, 0, 103, 104, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 944, 944, 944, 944, 944, 0, 0, 0, 944, - 0, 0, 0, 944, 0, 0, 0, 0, 944, 944, - 944, 944, 944, 0, 0, 0, 944, 0, 944, 0, - 0, 0, 0, 0, 944, 944, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 742, 0, + 105, 730, 107, 108, 0, 0, 56, 24, 0, 25, + 0, 731, 26, 253, 0, 0, 0, 27, 61, 62, + 0, 28, 0, 0, 24, 0, 25, 64, 0, 26, + 30, 0, 0, 0, 27, 0, 0, 32, 28, 0, + 0, 0, 33, 0, 71, 72, 34, 30, 0, 0, + 0, 0, 0, 0, 32, 0, 0, 0, 36, 33, + 37, 74, 0, 34, 38, 0, 0, 76, 0, 78, + 0, 80, 39, 40, 254, 36, 41, 37, 0, 0, + 0, 38, 0, 86, 0, 0, 87, 88, 0, 39, + 40, 0, 0, 41, 0, 0, 322, 0, 0, 0, + 0, 89, 90, 91, 92, 302, 0, 0, 0, 518, + 0, 0, 0, 95, 0, 0, 0, 0, 0, 97, + 98, 99, 100, 0, 0, 0, 101, 0, 102, 0, + 0, 0, 0, 0, 103, 104, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 792, 0, 0, 0, 944, - 944, 944, 944, 792, 792, 792, 792, 0, 0, 792, - 792, 0, 792, 792, 792, 792, 792, 792, 792, 0, - 0, 0, 0, 0, 792, 0, 792, 792, 792, 792, - 792, 792, 0, 0, 792, 0, 0, 0, 792, 792, - 0, 792, 792, 792, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 792, 0, 792, 0, 792, 792, 0, - 0, 792, 0, 792, 792, 792, 792, 792, 792, 792, - 792, 792, 792, 792, 792, 0, 792, 0, 0, 792, - 792, 0, 0, 792, 792, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 792, 792, - 792, 792, 792, 0, 0, 0, 792, 0, 0, 0, - 792, 0, 0, 0, 0, 792, 792, 792, 792, 792, - 0, 0, 0, 792, 0, 792, 0, 0, 0, 0, - 0, 792, 792, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 301, 0, 0, 0, 105, + 303, 107, 108, 56, 24, 0, 25, 0, 0, 26, + 253, 0, 0, 0, 27, 61, 62, 355, 28, 0, + 0, 24, 0, 25, 64, 0, 26, 30, 0, 0, + 0, 27, 0, 0, 32, 28, 0, 0, 0, 33, + 0, 71, 72, 34, 30, 0, 0, 0, 0, 0, + 0, 32, 0, 0, 0, 36, 33, 37, 74, 0, + 34, 38, 0, 0, 76, 0, 78, 0, 80, 39, + 40, 254, 36, 41, 37, 0, 0, 0, 38, 0, + 86, 0, 0, 87, 88, 0, 39, 40, 0, 0, + 41, 0, 0, 520, 0, 0, 0, 0, 89, 90, + 91, 92, 302, 0, 0, 0, 0, 0, 0, 0, + 95, 0, 0, 0, 0, 0, 97, 98, 99, 100, + 0, 0, 0, 101, 0, 102, 0, 0, 0, 0, + 0, 103, 104, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 733, 0, 0, 0, 792, 792, 792, 792, - 56, 24, 0, 25, 0, 0, 26, 253, 0, 892, - 0, 27, 61, 62, 0, 28, 0, 0, 24, 0, + 0, 0, 310, 0, 0, 0, 105, 303, 107, 108, + 56, 24, 0, 25, 0, 0, 26, 253, 0, 0, + 0, 27, 61, 62, 355, 28, 0, 0, 24, 0, 25, 64, 0, 26, 30, 0, 0, 0, 27, 0, 0, 32, 28, 0, 0, 0, 33, 0, 71, 72, 34, 30, 0, 0, 0, 0, 0, 0, 32, 0, @@ -10678,201 +10923,102 @@ void case_972() 0, 76, 0, 78, 0, 80, 39, 40, 254, 36, 41, 37, 0, 0, 0, 38, 0, 86, 0, 0, 87, 88, 0, 39, 40, 0, 0, 41, 0, 0, - 319, 0, 0, 0, 0, 89, 90, 91, 92, 300, - 0, 0, 0, 513, 734, 0, 0, 95, 0, 0, + 573, 0, 0, 0, 0, 89, 90, 91, 92, 302, + 0, 0, 0, 0, 0, 0, 0, 95, 0, 0, 0, 0, 0, 97, 98, 99, 100, 0, 0, 0, 101, 0, 102, 0, 0, 0, 0, 0, 103, 104, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 921, - 0, 0, 0, 105, 301, 107, 108, 56, 24, 0, - 25, 0, 0, 26, 253, 0, 1038, 0, 27, 61, - 62, 352, 28, 0, 0, 24, 0, 25, 64, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 591, + 0, 0, 0, 105, 303, 107, 108, 56, 24, 0, + 25, 0, 0, 26, 253, 0, 0, 0, 27, 61, + 62, 355, 28, 0, 0, 24, 0, 25, 64, 0, 26, 30, 0, 0, 0, 27, 0, 0, 32, 28, 0, 0, 0, 33, 0, 71, 72, 34, 30, 0, 0, 0, 0, 0, 0, 32, 0, 0, 0, 36, - 33, 37, 74, 922, 34, 38, 0, 0, 76, 0, + 33, 37, 74, 0, 34, 38, 0, 0, 76, 0, 78, 0, 80, 39, 40, 254, 36, 41, 37, 0, 0, 0, 38, 0, 86, 0, 0, 87, 88, 0, - 39, 40, 0, 0, 41, 0, 0, 319, 0, 0, - 0, 0, 89, 90, 91, 92, 300, 0, 0, 0, - 513, 0, 0, 0, 95, 0, 0, 0, 0, 0, + 39, 40, 0, 0, 41, 0, 0, 757, 0, 0, + 0, 0, 89, 90, 91, 92, 93, 0, 0, 0, + 0, 0, 0, 0, 95, 0, 0, 0, 0, 0, 97, 98, 99, 100, 0, 0, 0, 101, 0, 102, 0, 0, 0, 0, 0, 103, 104, 0, 0, 0, - 0, 0, 0, 56, 24, 0, 25, 0, 0, 26, - 253, 0, 0, 0, 27, 61, 62, 0, 28, 0, - 105, 301, 107, 108, 64, 0, 0, 30, 0, 0, - 0, 0, 0, 0, 32, 0, 0, 0, 352, 33, - 0, 71, 72, 34, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 36, 0, 37, 74, 0, - 0, 38, 0, 0, 76, 0, 78, 0, 80, 39, - 40, 254, 0, 41, 0, 0, 0, 0, 0, 0, - 86, 0, 0, 87, 88, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 89, 90, - 91, 92, 300, 0, 0, 0, 720, 990, 0, 0, - 95, 0, 0, 0, 0, 0, 97, 98, 99, 100, - 0, 0, 0, 101, 0, 102, 0, 0, 0, 0, - 0, 103, 104, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 733, 0, 105, 721, 107, 108, - 0, 0, 56, 24, 0, 25, 0, 722, 26, 253, - 0, 0, 0, 27, 61, 62, 0, 28, 0, 0, - 173, 0, 173, 64, 0, 173, 30, 0, 0, 0, - 173, 0, 0, 32, 173, 0, 0, 0, 33, 0, - 71, 72, 34, 173, 0, 0, 0, 0, 0, 0, - 173, 0, 0, 0, 36, 173, 37, 74, 922, 173, - 38, 0, 0, 76, 0, 78, 0, 80, 39, 40, - 254, 173, 41, 173, 0, 0, 0, 173, 0, 86, - 0, 0, 87, 88, 0, 173, 173, 0, 0, 173, - 0, 0, 173, 0, 0, 0, 0, 89, 90, 91, - 92, 300, 0, 0, 0, 513, 0, 0, 0, 95, - 0, 0, 0, 0, 0, 97, 98, 99, 100, 0, - 0, 0, 101, 0, 102, 0, 0, 968, 0, 0, - 103, 104, 0, 0, 0, 0, 0, 0, 56, 24, - 0, 25, 0, 0, 26, 253, 0, 0, 0, 27, - 61, 62, 0, 28, 0, 105, 301, 107, 108, 64, - 0, 0, 30, 0, 0, 0, 0, 0, 0, 32, - 0, 0, 0, 173, 33, 0, 71, 72, 34, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 36, 0, 37, 74, 0, 0, 38, 0, 0, 76, - 0, 78, 0, 80, 39, 40, 254, 0, 41, 0, - 0, 0, 0, 0, 0, 86, 0, 0, 87, 88, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 89, 90, 91, 92, 300, 0, 0, - 0, 720, 0, 0, 0, 95, 0, 0, 0, 0, - 0, 97, 98, 99, 100, 0, 0, 0, 101, 0, - 102, 0, 0, 0, 0, 0, 103, 104, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 733, - 0, 105, 721, 107, 108, 0, 0, 56, 24, 0, - 25, 0, 722, 26, 253, 0, 0, 0, 27, 61, - 62, 0, 28, 0, 0, 173, 0, 173, 64, 0, - 173, 30, 0, 0, 0, 173, 0, 0, 32, 173, - 0, 0, 0, 33, 0, 71, 72, 34, 173, 0, - 0, 0, 0, 0, 0, 173, 0, 0, 0, 36, - 173, 37, 74, 0, 173, 38, 0, 0, 76, 0, - 78, 0, 80, 39, 40, 254, 173, 41, 173, 0, - 0, 0, 173, 0, 86, 0, 0, 87, 88, 0, - 173, 173, 0, 0, 173, 0, 0, 173, 0, 0, - 0, 0, 89, 90, 91, 92, 300, 0, 0, 0, - 513, 0, 0, 0, 95, 0, 0, 0, 0, 0, - 97, 98, 99, 100, 0, 0, 0, 101, 0, 102, - 968, 0, 0, 0, 0, 103, 104, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 586, 0, 0, 0, - 105, 301, 107, 108, 56, 24, 0, 25, 0, 0, - 26, 253, 0, 0, 0, 27, 61, 62, 173, 28, - 0, 0, 24, 0, 25, 64, 0, 26, 30, 0, - 0, 0, 27, 0, 0, 32, 28, 0, 0, 0, - 33, 0, 71, 72, 34, 30, 0, 0, 0, 0, - 0, 0, 32, 0, 0, 0, 36, 33, 37, 74, - 0, 34, 38, 0, 0, 76, 0, 78, 0, 80, - 39, 40, 254, 36, 41, 37, 0, 0, 0, 38, - 0, 86, 0, 0, 87, 88, 0, 39, 40, 0, - 0, 41, 0, 0, 319, 0, 0, 0, 0, 89, - 90, 91, 92, 93, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 820, 0, 0, 0, + 105, 106, 107, 108, 56, 24, 0, 25, 0, 0, + 26, 253, 0, 0, 0, 27, 61, 62, 355, 28, + 0, 0, 488, 0, 488, 64, 0, 488, 30, 0, + 0, 0, 488, 0, 0, 32, 488, 0, 0, 0, + 33, 0, 71, 72, 34, 488, 0, 0, 0, 0, + 0, 0, 488, 0, 0, 0, 36, 488, 37, 74, + 0, 488, 38, 0, 0, 76, 0, 78, 0, 80, + 39, 40, 254, 488, 41, 488, 0, 0, 0, 488, + 0, 86, 0, 0, 87, 88, 0, 488, 488, 0, + 0, 488, 0, 0, 488, 0, 0, 0, 0, 89, + 90, 91, 92, 302, 0, 0, 0, 0, 0, 0, 0, 95, 0, 0, 0, 0, 0, 97, 98, 99, 100, 0, 0, 0, 101, 0, 102, 0, 0, 0, 0, 0, 103, 104, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 810, 0, 0, 0, 105, 106, 107, + 0, 0, 0, 1184, 0, 0, 0, 105, 303, 107, 108, 56, 24, 0, 25, 0, 0, 26, 253, 0, - 0, 0, 27, 61, 62, 352, 28, 0, 0, 24, - 0, 25, 64, 0, 26, 30, 0, 0, 0, 27, - 0, 0, 32, 28, 0, 0, 0, 33, 0, 71, - 72, 34, 30, 0, 0, 0, 0, 0, 0, 32, - 0, 0, 0, 36, 33, 37, 74, 0, 34, 38, + 0, 0, 27, 61, 62, 488, 28, 0, 0, 175, + 0, 175, 64, 0, 175, 30, 0, 0, 0, 175, + 0, 0, 32, 175, 0, 0, 0, 33, 0, 71, + 72, 34, 175, 0, 0, 0, 0, 0, 0, 175, + 0, 0, 0, 36, 175, 37, 74, 0, 175, 38, 0, 0, 76, 0, 78, 0, 80, 39, 40, 254, - 36, 41, 37, 0, 0, 0, 38, 0, 86, 0, - 0, 87, 88, 0, 39, 40, 0, 0, 41, 0, - 0, 515, 0, 0, 0, 0, 89, 90, 91, 92, - 300, 0, 0, 0, 0, 0, 0, 0, 95, 0, + 175, 41, 175, 0, 0, 0, 175, 0, 86, 0, + 0, 87, 88, 0, 175, 175, 0, 0, 175, 0, + 0, 175, 0, 0, 0, 0, 89, 90, 91, 92, + 302, 0, 0, 0, 0, 0, 0, 0, 95, 0, 0, 0, 0, 0, 97, 98, 99, 100, 0, 0, 0, 101, 0, 102, 0, 0, 0, 0, 0, 103, 104, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 1174, 0, 0, 0, 105, 301, 107, 108, 56, 24, - 0, 25, 0, 0, 26, 253, 0, 0, 0, 27, - 61, 62, 352, 28, 0, 0, 24, 0, 25, 64, - 0, 26, 30, 0, 0, 0, 27, 0, 0, 32, - 28, 0, 0, 0, 33, 0, 71, 72, 34, 30, - 0, 0, 0, 0, 0, 0, 32, 0, 0, 0, - 36, 33, 37, 74, 0, 34, 38, 0, 0, 76, - 0, 78, 0, 80, 39, 40, 254, 36, 41, 37, - 0, 0, 0, 38, 0, 86, 0, 0, 87, 88, - 0, 39, 40, 0, 0, 41, 0, 0, 568, 0, - 0, 0, 0, 89, 90, 91, 92, 300, 0, 0, - 0, 0, 0, 0, 0, 95, 0, 0, 0, 0, - 0, 97, 98, 99, 100, 0, 0, 0, 101, 0, - 102, 0, 0, 0, 0, 0, 103, 104, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 606, 0, 0, - 0, 105, 301, 107, 108, 606, 606, 0, 606, 0, - 0, 606, 606, 0, 0, 0, 606, 606, 606, 352, - 606, 0, 0, 24, 0, 25, 606, 0, 26, 606, - 0, 0, 0, 27, 0, 0, 606, 28, 0, 0, - 0, 606, 0, 606, 606, 606, 30, 0, 0, 0, - 0, 0, 0, 32, 0, 0, 0, 606, 33, 606, - 606, 0, 34, 606, 0, 0, 606, 0, 606, 0, - 606, 606, 606, 606, 36, 606, 37, 0, 0, 0, - 38, 0, 606, 0, 0, 606, 606, 0, 39, 40, - 0, 0, 41, 0, 0, 748, 0, 0, 0, 0, - 606, 606, 606, 606, 606, 0, 0, 0, 0, 0, - 0, 0, 606, 0, 0, 0, 0, 0, 606, 606, - 606, 606, 0, 0, 0, 606, 0, 606, 0, 0, - 0, 0, 0, 606, 606, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 496, 0, 0, 0, 606, 606, - 606, 606, 56, 24, 0, 25, 0, 0, 26, 253, - 0, 0, 0, 27, 61, 62, 352, 28, 0, 0, - 0, 0, 0, 64, 0, 0, 30, 0, 0, 0, - 27, 0, 0, 32, 0, 0, 0, 334, 33, 0, - 71, 72, 34, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 27, 36, 0, 37, 74, 0, 0, - 38, 0, 0, 76, 0, 78, 27, 80, 39, 40, - 254, 27, 41, 334, 0, 0, 27, 0, 27, 27, - 27, 27, 0, 0, 27, 0, 27, 0, 0, 0, - 27, 0, 0, 0, 0, 0, 0, 89, 90, 91, - 255, 0, 27, 0, 0, 27, 0, 27, 0, 95, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 608, 0, 0, 0, 105, 303, 107, 108, 608, 608, + 0, 608, 0, 0, 608, 608, 0, 0, 0, 608, + 608, 608, 175, 608, 0, 0, 0, 0, 0, 608, + 0, 0, 608, 0, 0, 0, 0, 0, 0, 608, + 0, 0, 0, 0, 608, 0, 608, 608, 608, 0, + 0, 0, 0, 0, 0, 0, 335, 0, 0, 0, + 608, 0, 608, 608, 0, 0, 608, 0, 0, 608, + 0, 608, 0, 608, 608, 608, 608, 0, 608, 0, + 0, 0, 0, 0, 0, 608, 0, 0, 608, 608, + 0, 0, 335, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 608, 608, 608, 608, 608, 0, 0, + 0, 0, 0, 0, 0, 608, 0, 0, 0, 0, + 0, 608, 608, 608, 608, 0, 0, 0, 608, 0, + 608, 0, 0, 0, 0, 0, 608, 608, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 27, 0, 0, 0, 0, 0, 27, 27, 0, - 0, 0, 0, 0, 0, 0, 334, 334, 334, 334, - 741, 0, 0, 334, 334, 105, 497, 334, 334, 334, - 334, 334, 334, 334, 334, 334, 0, 334, 334, 334, - 334, 334, 334, 334, 334, 334, 334, 334, 334, 334, - 334, 334, 334, 334, 334, 334, 334, 334, 334, 0, - 48, 0, 48, 0, 48, 334, 48, 0, 334, 48, - 0, 48, 48, 0, 48, 0, 48, 0, 48, 0, - 48, 48, 48, 48, 0, 0, 48, 48, 0, 0, - 0, 0, 48, 48, 48, 48, 48, 0, 0, 48, - 0, 48, 0, 48, 0, 48, 48, 48, 48, 48, - 48, 48, 48, 0, 48, 48, 48, 48, 0, 0, - 48, 48, 48, 0, 48, 0, 0, 0, 0, 48, - 48, 0, 48, 48, 0, 48, 48, 48, 0, 0, - 0, 48, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 48, 0, 48, 48, 47, 0, 0, 0, 47, - 0, 47, 0, 0, 47, 0, 47, 47, 0, 47, - 0, 47, 0, 47, 0, 47, 47, 47, 47, 0, - 0, 47, 47, 0, 0, 0, 0, 47, 0, 47, - 47, 47, 0, 0, 47, 0, 47, 0, 47, 0, - 0, 47, 0, 47, 47, 47, 47, 48, 0, 0, - 47, 47, 47, 0, 0, 47, 47, 47, 0, 0, - 0, 0, 0, 0, 47, 47, 0, 47, 47, 0, - 47, 47, 47, 0, 0, 0, 47, 0, 0, 0, + 0, 608, 608, 608, 608, 335, 335, 335, 335, 743, + 0, 0, 335, 335, 0, 0, 335, 335, 335, 335, + 335, 335, 335, 335, 335, 0, 335, 335, 335, 335, + 335, 335, 335, 335, 335, 335, 335, 335, 335, 335, + 335, 335, 335, 335, 335, 335, 335, 335, 0, 48, + 0, 48, 0, 48, 335, 48, 0, 335, 48, 0, + 48, 48, 0, 48, 0, 48, 0, 48, 0, 48, + 48, 48, 48, 0, 0, 48, 48, 0, 0, 0, + 0, 48, 48, 48, 48, 48, 0, 0, 48, 0, + 48, 0, 48, 0, 48, 48, 0, 48, 48, 48, + 48, 0, 0, 48, 48, 48, 48, 0, 0, 48, + 48, 48, 0, 0, 0, 0, 0, 0, 48, 48, + 0, 48, 48, 0, 48, 48, 48, 0, 0, 0, + 48, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 47, 0, 47, 0, 47, 0, - 47, 0, 80, 47, 0, 47, 47, 0, 47, 0, - 47, 47, 47, 0, 47, 47, 47, 47, 0, 0, + 48, 0, 48, 48, 47, 0, 0, 0, 47, 0, + 47, 0, 0, 47, 0, 47, 47, 0, 47, 0, + 47, 0, 47, 0, 47, 47, 47, 47, 0, 0, 47, 47, 0, 0, 0, 0, 47, 0, 47, 47, 47, 0, 0, 47, 0, 47, 0, 47, 0, 0, - 47, 0, 47, 47, 47, 47, 0, 0, 0, 47, - 47, 47, 47, 0, 47, 47, 47, 0, 0, 0, + 47, 0, 47, 47, 47, 47, 48, 0, 0, 47, + 47, 47, 0, 0, 47, 47, 47, 0, 0, 0, 0, 0, 0, 47, 47, 0, 47, 47, 0, 47, 47, 47, 0, 0, 0, 47, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 47, 0, 47, 0, 47, 0, 47, - 0, 81, 47, 0, 47, 47, 0, 47, 0, 47, + 0, 80, 47, 0, 47, 47, 0, 47, 0, 47, 47, 47, 0, 47, 47, 47, 47, 0, 0, 47, 47, 0, 0, 0, 0, 47, 0, 47, 47, 47, 0, 0, 47, 0, 47, 0, 47, 0, 0, 47, @@ -10880,693 +11026,722 @@ void case_972() 47, 47, 0, 47, 47, 47, 0, 0, 0, 0, 0, 0, 47, 47, 0, 47, 47, 0, 47, 47, 47, 0, 0, 0, 47, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 48, 0, 0, - 0, 48, 0, 48, 47, 0, 48, 0, 48, 48, - 213, 48, 0, 48, 0, 48, 0, 48, 48, 48, - 48, 0, 0, 48, 48, 0, 0, 0, 0, 48, - 0, 48, 48, 48, 0, 0, 48, 0, 48, 0, - 48, 0, 0, 48, 0, 48, 48, 48, 48, 0, - 0, 0, 48, 48, 48, 0, 0, 48, 48, 48, - 47, 0, 0, 0, 0, 0, 48, 48, 0, 48, - 48, 0, 48, 48, 48, 0, 0, 0, 48, 0, - 0, 0, 0, 47, 0, 0, 0, 47, 0, 47, - 0, 0, 47, 0, 47, 47, 0, 47, 48, 47, - 0, 47, 0, 47, 47, 47, 47, 0, 0, 47, - 47, 0, 0, 48, 0, 47, 0, 47, 47, 47, - 0, 0, 47, 0, 47, 334, 47, 0, 0, 47, - 0, 47, 47, 47, 47, 0, 0, 0, 47, 47, - 47, 0, 0, 47, 47, 47, 0, 0, 334, 0, - 0, 0, 47, 47, 48, 47, 47, 0, 47, 47, - 47, 334, 0, 0, 47, 0, 334, 0, 0, 334, - 0, 334, 0, 334, 334, 334, 334, 0, 0, 0, - 0, 334, 0, 0, 47, 334, 0, 0, 0, 334, - 214, 0, 0, 0, 0, 0, 0, 334, 0, 0, - 334, 0, 334, 56, 24, 0, 25, 0, 0, 26, - 253, 0, 0, 0, 27, 61, 62, 0, 28, 0, - 0, 334, 0, 0, 64, 0, 334, 30, 0, 0, - 0, 0, 0, 334, 32, 264, 0, 334, 0, 33, - 47, 71, 72, 34, 0, 588, 0, 0, 0, 0, - 334, 0, 589, 0, 0, 36, 0, 37, 74, 0, - 0, 38, 0, 0, 76, 0, 78, 0, 80, 39, - 40, 254, 0, 41, 0, 0, 0, 0, 0, 0, - 590, 0, 334, 87, 88, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 89, 90, - 91, 92, 93, 0, 0, 0, 0, 0, 0, 0, - 95, 916, 0, 591, 0, 0, 97, 98, 99, 100, - 0, 0, 0, 101, 0, 102, 0, 0, 0, 0, - 0, 103, 104, 0, 0, 0, 0, 0, 0, 56, - 24, 0, 25, 0, 0, 26, 253, 0, 0, 0, - 27, 61, 62, 0, 28, 0, 105, 106, 107, 108, - 64, 0, 0, 30, 0, 0, 0, 0, 0, 0, - 32, 0, 0, 0, 0, 33, 0, 71, 72, 34, - 0, 588, 0, 0, 0, 0, 0, 0, 589, 0, - 0, 36, 0, 37, 74, 0, 0, 38, 0, 0, - 76, 0, 78, 0, 80, 39, 40, 254, 0, 41, - 0, 0, 0, 0, 0, 0, 590, 0, 0, 87, - 88, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 89, 90, 91, 92, 93, 0, - 0, 0, 0, 0, 0, 0, 95, 0, 0, 591, - 0, 0, 97, 98, 99, 100, 0, 0, 0, 101, - 0, 102, 0, 0, 0, 0, 0, 103, 104, 0, - 0, 0, 0, 0, 0, 56, 24, 0, 25, 0, - 0, 26, 253, 0, 0, 0, 27, 61, 62, 0, - 28, 0, 105, 106, 107, 108, 64, 0, 0, 30, - 0, 0, 0, 0, 0, 0, 32, 0, 0, 0, - 0, 33, 0, 71, 72, 34, 0, 588, 0, 0, - 0, 0, 0, 0, 589, 0, 0, 36, 0, 37, - 74, 0, 0, 38, 0, 0, 76, 0, 78, 0, - 80, 39, 40, 254, 0, 41, 0, 0, 0, 0, - 0, 0, 590, 0, 0, 87, 88, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 89, 90, 91, 92, 93, 0, 0, 0, 0, 0, - 0, 0, 95, 0, 0, 0, 0, 0, 97, 98, - 99, 100, 0, 0, 0, 101, 0, 102, 0, 0, - 0, 0, 0, 103, 104, 0, 0, 0, 0, 0, - 0, 56, 24, 0, 25, 0, 0, 26, 253, 0, - 0, 0, 27, 61, 62, 0, 28, 0, 105, 106, - 107, 108, 64, 0, 0, 30, 0, 0, 0, 0, - 0, 0, 32, 0, 0, 0, 0, 33, 0, 71, - 72, 34, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 36, 0, 37, 74, 0, 0, 38, - 0, 0, 76, 0, 78, 0, 80, 39, 40, 254, - 0, 41, 0, 0, 84, 0, 0, 0, 86, 0, - 0, 87, 88, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 89, 90, 91, 92, - 300, 0, 0, 0, 0, 0, 0, 0, 95, 0, - 0, 0, 0, 0, 97, 98, 99, 100, 0, 0, - 0, 101, 0, 102, 0, 0, 0, 0, 0, 103, - 104, 0, 0, 0, 0, 0, 0, 56, 24, 0, - 25, 0, 0, 26, 253, 0, 0, 0, 27, 61, - 62, 0, 28, 0, 105, 301, 107, 108, 64, 0, - 0, 30, 0, 0, 0, 0, 0, 0, 32, 0, - 0, 0, 0, 33, 0, 71, 72, 34, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 36, - 0, 37, 74, 0, 0, 38, 0, 0, 76, 0, - 78, 0, 80, 39, 40, 254, 0, 41, 0, 0, - 0, 0, 0, 0, 86, 0, 0, 87, 88, 0, + 0, 0, 47, 0, 47, 0, 47, 0, 47, 0, + 81, 47, 0, 47, 47, 0, 47, 0, 47, 47, + 47, 0, 47, 47, 47, 47, 0, 0, 47, 47, + 0, 0, 0, 0, 47, 0, 47, 47, 47, 0, + 0, 47, 0, 47, 0, 47, 0, 0, 47, 0, + 47, 47, 47, 47, 0, 0, 0, 47, 47, 47, + 47, 0, 47, 47, 47, 0, 0, 0, 0, 0, + 0, 47, 47, 0, 47, 47, 0, 47, 47, 47, + 0, 0, 0, 47, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 48, 0, 0, 0, + 48, 0, 48, 47, 0, 48, 0, 48, 48, 214, + 48, 0, 48, 0, 48, 0, 48, 48, 48, 48, + 0, 0, 48, 48, 0, 0, 0, 0, 48, 0, + 48, 48, 48, 0, 0, 48, 0, 48, 0, 48, + 0, 0, 48, 0, 48, 48, 48, 48, 0, 0, + 0, 48, 48, 48, 0, 0, 48, 48, 48, 47, + 0, 0, 0, 0, 0, 48, 48, 0, 48, 48, + 0, 48, 48, 48, 0, 0, 0, 48, 0, 0, + 0, 0, 47, 0, 0, 0, 47, 0, 47, 0, + 0, 47, 0, 47, 47, 0, 47, 48, 47, 0, + 47, 0, 47, 47, 47, 47, 0, 0, 47, 47, + 0, 0, 48, 0, 47, 0, 47, 47, 47, 0, + 0, 47, 0, 47, 335, 47, 0, 0, 47, 0, + 47, 47, 47, 47, 0, 0, 0, 47, 47, 47, + 0, 0, 47, 47, 47, 0, 0, 335, 0, 0, + 0, 47, 47, 48, 47, 47, 0, 47, 47, 47, + 335, 0, 0, 47, 0, 335, 0, 0, 335, 0, + 335, 0, 335, 335, 335, 335, 0, 0, 0, 0, + 335, 0, 0, 47, 335, 0, 0, 0, 335, 215, + 0, 0, 0, 0, 0, 0, 335, 0, 0, 335, + 0, 335, 56, 24, 0, 25, 0, 0, 26, 253, + 0, 0, 0, 27, 61, 62, 0, 28, 0, 0, + 335, 0, 0, 64, 0, 335, 30, 0, 0, 0, + 0, 0, 335, 32, 265, 0, 335, 0, 33, 47, + 71, 72, 34, 0, 593, 0, 0, 0, 0, 335, + 0, 594, 0, 0, 36, 0, 37, 74, 0, 0, + 38, 0, 0, 76, 0, 78, 0, 80, 39, 40, + 254, 0, 41, 0, 0, 0, 0, 0, 0, 595, + 0, 335, 87, 88, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 89, 90, 91, + 92, 93, 0, 0, 0, 0, 0, 0, 0, 95, + 927, 0, 596, 0, 0, 97, 98, 99, 100, 0, + 0, 0, 101, 0, 102, 0, 0, 0, 0, 0, + 103, 104, 0, 0, 0, 0, 0, 0, 56, 24, + 0, 25, 0, 0, 26, 253, 0, 0, 0, 27, + 61, 62, 0, 28, 0, 105, 106, 107, 108, 64, + 0, 0, 30, 0, 0, 0, 0, 0, 0, 32, + 0, 0, 0, 0, 33, 0, 71, 72, 34, 0, + 593, 0, 0, 0, 0, 0, 0, 594, 0, 0, + 36, 0, 37, 74, 0, 0, 38, 0, 0, 76, + 0, 78, 0, 80, 39, 40, 254, 0, 41, 0, + 0, 0, 0, 0, 0, 595, 0, 0, 87, 88, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 89, 90, 91, 92, 300, 0, 0, 0, - 0, 875, 0, 0, 95, 0, 0, 0, 0, 0, - 97, 98, 99, 100, 0, 0, 0, 101, 0, 102, - 0, 0, 0, 0, 0, 103, 104, 0, 0, 0, - 0, 0, 0, 56, 24, 0, 25, 0, 0, 26, - 253, 0, 0, 0, 27, 61, 62, 0, 28, 0, - 105, 301, 107, 108, 64, 0, 0, 30, 0, 0, - 0, 0, 0, 0, 32, 0, 0, 0, 0, 33, - 0, 71, 72, 34, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 36, 0, 37, 74, 0, - 0, 38, 0, 0, 76, 0, 78, 0, 80, 39, - 40, 254, 0, 41, 0, 0, 0, 0, 0, 0, - 86, 0, 0, 87, 88, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 89, 90, - 91, 92, 300, 0, 0, 0, 513, 0, 0, 0, - 95, 0, 0, 0, 0, 0, 97, 98, 99, 100, - 0, 0, 0, 101, 0, 102, 0, 0, 0, 0, - 0, 103, 104, 0, 0, 0, 0, 0, 0, 56, - 24, 0, 25, 0, 0, 26, 253, 0, 0, 0, - 27, 61, 62, 0, 28, 0, 105, 301, 107, 108, - 64, 0, 0, 30, 0, 0, 0, 0, 0, 0, - 32, 0, 0, 0, 0, 33, 0, 71, 72, 34, + 0, 0, 0, 89, 90, 91, 92, 93, 0, 0, + 0, 0, 0, 0, 0, 95, 0, 0, 596, 0, + 0, 97, 98, 99, 100, 0, 0, 0, 101, 0, + 102, 0, 0, 0, 0, 0, 103, 104, 0, 0, + 0, 0, 0, 0, 56, 24, 0, 25, 0, 0, + 26, 253, 0, 0, 0, 27, 61, 62, 0, 28, + 0, 105, 106, 107, 108, 64, 0, 0, 30, 0, + 0, 0, 0, 0, 0, 32, 0, 0, 0, 0, + 33, 0, 71, 72, 34, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 36, 0, 37, 74, + 0, 0, 38, 0, 0, 76, 0, 78, 0, 80, + 39, 40, 254, 0, 41, 0, 0, 84, 0, 0, + 0, 86, 0, 0, 87, 88, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 89, + 90, 91, 92, 302, 0, 0, 0, 0, 0, 0, + 0, 95, 0, 0, 0, 0, 0, 97, 98, 99, + 100, 0, 0, 0, 101, 0, 102, 0, 0, 0, + 0, 0, 103, 104, 0, 0, 0, 0, 0, 0, + 56, 24, 0, 25, 0, 0, 26, 253, 0, 0, + 0, 27, 61, 62, 0, 28, 0, 105, 303, 107, + 108, 64, 0, 0, 30, 0, 0, 0, 0, 0, + 0, 32, 0, 0, 0, 0, 33, 0, 71, 72, + 34, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 36, 0, 37, 74, 0, 0, 38, 0, + 0, 76, 0, 78, 0, 80, 39, 40, 254, 0, + 41, 0, 0, 0, 0, 0, 0, 86, 0, 0, + 87, 88, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 89, 90, 91, 92, 302, + 0, 0, 0, 0, 886, 0, 0, 95, 0, 0, + 0, 0, 0, 97, 98, 99, 100, 0, 0, 0, + 101, 0, 102, 0, 0, 0, 0, 0, 103, 104, + 0, 0, 0, 0, 0, 0, 56, 24, 0, 25, + 0, 0, 26, 253, 0, 0, 0, 27, 61, 62, + 0, 28, 0, 105, 303, 107, 108, 64, 0, 0, + 30, 0, 0, 0, 0, 0, 0, 32, 0, 0, + 0, 0, 33, 0, 71, 72, 34, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 36, 0, + 37, 74, 0, 0, 38, 0, 0, 76, 0, 78, + 0, 80, 39, 40, 254, 0, 41, 0, 0, 0, + 0, 0, 0, 86, 0, 0, 87, 88, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 36, 0, 37, 74, 0, 0, 38, 0, 0, - 76, 0, 78, 0, 80, 39, 40, 254, 0, 41, - 0, 0, 0, 0, 0, 0, 86, 0, 0, 87, - 88, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 89, 90, 91, 92, 300, 0, - 0, 0, 507, 0, 0, 0, 95, 0, 0, 0, - 0, 0, 97, 98, 99, 100, 0, 0, 0, 101, - 0, 102, 0, 0, 0, 0, 0, 103, 104, 0, - 0, 0, 0, 0, 0, 56, 24, 0, 25, 0, - 0, 26, 253, 0, 0, 0, 27, 61, 62, 0, - 28, 0, 105, 301, 107, 108, 64, 0, 0, 30, - 0, 0, 0, 0, 0, 0, 32, 0, 0, 0, - 0, 33, 0, 71, 72, 34, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 36, 0, 37, - 74, 0, 0, 38, 0, 0, 76, 0, 78, 0, - 80, 39, 40, 254, 0, 41, 0, 0, 0, 0, - 0, 0, 86, 0, 0, 87, 88, 0, 0, 0, + 0, 89, 90, 91, 92, 302, 0, 0, 0, 518, + 0, 0, 0, 95, 0, 0, 0, 0, 0, 97, + 98, 99, 100, 0, 0, 0, 101, 0, 102, 0, + 0, 0, 0, 0, 103, 104, 0, 0, 0, 0, + 0, 0, 56, 24, 0, 25, 0, 0, 26, 253, + 0, 0, 0, 27, 61, 62, 0, 28, 0, 105, + 303, 107, 108, 64, 0, 0, 30, 0, 0, 0, + 0, 0, 0, 32, 0, 0, 0, 0, 33, 0, + 71, 72, 34, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 36, 0, 37, 74, 0, 0, + 38, 0, 0, 76, 0, 78, 0, 80, 39, 40, + 254, 0, 41, 0, 0, 0, 0, 0, 0, 86, + 0, 0, 87, 88, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 89, 90, 91, + 92, 302, 0, 0, 0, 512, 0, 0, 0, 95, + 0, 0, 0, 0, 0, 97, 98, 99, 100, 0, + 0, 0, 101, 0, 102, 0, 0, 0, 0, 0, + 103, 104, 0, 0, 0, 0, 0, 0, 56, 24, + 0, 25, 0, 0, 26, 253, 0, 0, 0, 27, + 61, 62, 0, 28, 0, 105, 303, 107, 108, 64, + 0, 0, 30, 0, 0, 0, 0, 0, 0, 32, + 0, 0, 0, 0, 33, 0, 71, 72, 34, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 89, 90, 91, 92, 300, 0, 0, 0, 0, 0, - 0, 0, 95, 0, 0, 0, 0, 0, 97, 98, - 99, 100, 0, 0, 0, 101, 0, 102, 0, 0, - 0, 0, 0, 103, 104, 0, 0, 0, 0, 0, - 0, 56, 24, 0, 25, 0, 0, 26, 253, 0, - 0, 0, 27, 61, 62, 0, 28, 0, 105, 301, - 107, 108, 64, 0, 0, 30, 0, 0, 0, 0, - 0, 0, 32, 0, 0, 0, 0, 33, 0, 71, - 72, 34, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 36, 0, 37, 74, 0, 0, 38, - 0, 0, 76, 0, 78, 0, 80, 39, 40, 254, - 0, 41, 0, 0, 0, 0, 0, 0, 86, 0, - 0, 87, 88, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 89, 90, 91, 92, - 93, 0, 0, 0, 0, 0, 0, 0, 95, 0, - 0, 0, 0, 0, 97, 98, 99, 100, 0, 0, - 0, 101, 0, 102, 0, 0, 0, 0, 0, 103, - 104, 0, 0, 0, 0, 0, 0, 56, 24, 0, - 25, 0, 0, 26, 253, 0, 0, 0, 27, 61, - 62, 0, 28, 0, 105, 106, 107, 108, 64, 0, - 0, 30, 0, 0, 0, 0, 0, 0, 32, 0, - 0, 0, 0, 33, 0, 71, 72, 34, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 36, - 0, 37, 74, 0, 0, 38, 0, 0, 76, 0, - 78, 0, 80, 39, 40, 254, 0, 41, 0, 0, - 0, 0, 0, 0, 86, 0, 0, 87, 88, 0, + 36, 0, 37, 74, 0, 0, 38, 0, 0, 76, + 0, 78, 0, 80, 39, 40, 254, 0, 41, 0, + 0, 0, 0, 0, 0, 86, 0, 0, 87, 88, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 89, 90, 91, 92, 93, 0, 0, 0, - 0, 0, 0, 0, 95, 0, 0, 0, 0, 0, - 97, 98, 99, 100, 0, 0, 0, 101, 0, 102, - 0, 0, 0, 0, 0, 103, 104, 0, 0, 0, - 0, 0, 0, 77, 77, 0, 77, 0, 0, 77, - 77, 0, 0, 0, 77, 77, 77, 0, 77, 0, - 105, 1030, 107, 108, 77, 0, 0, 77, 0, 0, - 0, 0, 0, 0, 77, 0, 0, 0, 0, 77, - 0, 77, 77, 77, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 77, 0, 77, 77, 0, - 0, 77, 0, 0, 77, 0, 77, 0, 77, 77, - 77, 77, 0, 77, 0, 0, 0, 0, 0, 0, - 77, 0, 0, 77, 77, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 77, 77, - 77, 77, 77, 0, 0, 0, 0, 0, 0, 0, - 77, 0, 0, 0, 0, 0, 77, 77, 77, 77, - 0, 0, 0, 77, 0, 77, 0, 0, 0, 0, - 0, 77, 77, 0, 0, 0, 0, 0, 0, 135, - 135, 0, 135, 0, 0, 135, 135, 0, 0, 0, - 135, 135, 135, 0, 135, 0, 77, 77, 77, 77, - 135, 0, 0, 135, 0, 0, 0, 0, 0, 0, - 135, 0, 0, 0, 0, 135, 0, 135, 135, 135, + 0, 0, 0, 89, 90, 91, 92, 302, 0, 0, + 0, 0, 0, 0, 0, 95, 0, 0, 0, 0, + 0, 97, 98, 99, 100, 0, 0, 0, 101, 0, + 102, 0, 0, 0, 0, 0, 103, 104, 0, 0, + 0, 0, 0, 0, 56, 24, 0, 25, 0, 0, + 26, 253, 0, 0, 0, 27, 61, 62, 0, 28, + 0, 105, 303, 107, 108, 64, 0, 0, 30, 0, + 0, 0, 0, 0, 0, 32, 0, 0, 0, 0, + 33, 0, 71, 72, 34, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 36, 0, 37, 74, + 0, 0, 38, 0, 0, 76, 0, 78, 0, 80, + 39, 40, 254, 0, 41, 0, 0, 0, 0, 0, + 0, 86, 0, 0, 87, 88, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 89, + 90, 91, 92, 93, 0, 0, 0, 0, 0, 0, + 0, 95, 0, 0, 0, 0, 0, 97, 98, 99, + 100, 0, 0, 0, 101, 0, 102, 0, 0, 0, + 0, 0, 103, 104, 0, 0, 0, 0, 0, 0, + 56, 24, 0, 25, 0, 0, 26, 253, 0, 0, + 0, 27, 61, 62, 0, 28, 0, 105, 106, 107, + 108, 64, 0, 0, 30, 0, 0, 0, 0, 0, + 0, 32, 0, 0, 0, 0, 33, 0, 71, 72, + 34, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 36, 0, 37, 74, 0, 0, 38, 0, + 0, 76, 0, 78, 0, 80, 39, 40, 254, 0, + 41, 0, 0, 0, 0, 0, 0, 86, 0, 0, + 87, 88, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 89, 90, 91, 92, 93, + 0, 0, 0, 0, 0, 0, 0, 95, 0, 0, + 0, 0, 0, 97, 98, 99, 100, 0, 0, 0, + 101, 0, 102, 0, 0, 0, 0, 0, 103, 104, + 0, 0, 0, 0, 0, 0, 77, 77, 0, 77, + 0, 0, 77, 77, 0, 0, 0, 77, 77, 77, + 0, 77, 0, 105, 1041, 107, 108, 77, 0, 0, + 77, 0, 0, 0, 0, 0, 0, 77, 0, 0, + 0, 0, 77, 0, 77, 77, 77, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 77, 0, + 77, 77, 0, 0, 77, 0, 0, 77, 0, 77, + 0, 77, 77, 77, 77, 0, 77, 0, 0, 0, + 0, 0, 0, 77, 0, 0, 77, 77, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 135, 0, 135, 135, 0, 0, 135, 0, 0, - 135, 0, 135, 0, 135, 135, 135, 135, 0, 135, - 0, 0, 0, 0, 0, 0, 135, 0, 0, 135, - 135, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 135, 135, 135, 135, 135, 0, - 0, 0, 0, 0, 0, 0, 135, 0, 0, 0, - 0, 0, 135, 135, 135, 135, 0, 0, 0, 135, - 0, 135, 0, 0, 0, 0, 0, 135, 135, 0, - 0, 0, 0, 0, 0, 56, 24, 0, 25, 0, - 0, 26, 253, 0, 0, 0, 27, 61, 62, 0, - 28, 0, 135, 135, 135, 135, 64, 0, 0, 30, - 0, 0, 0, 0, 0, 0, 32, 0, 27, 0, - 27, 33, 0, 71, 72, 34, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 36, 0, 37, - 74, 27, 0, 38, 0, 0, 76, 0, 78, 0, - 80, 39, 40, 254, 27, 41, 0, 0, 0, 27, - 0, 0, 0, 0, 27, 0, 27, 27, 27, 27, - 0, 0, 0, 0, 27, 0, 0, 0, 27, 0, - 89, 90, 91, 255, 300, 0, 0, 0, 0, 0, - 27, 0, 95, 27, 0, 27, 0, 0, 97, 98, - 99, 100, 0, 0, 0, 101, 0, 102, 0, 0, - 0, 0, 0, 103, 104, 0, 0, 0, 0, 27, - 0, 0, 0, 0, 0, 27, 27, 0, 0, 0, - 0, 0, 0, 639, 0, 639, 0, 639, 105, 256, - 639, 108, 639, 639, 0, 639, 0, 639, 0, 639, - 0, 639, 639, 639, 0, 0, 0, 639, 639, 0, - 0, 0, 0, 639, 0, 639, 639, 0, 0, 0, - 639, 0, 0, 0, 639, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 639, 639, 0, 639, 0, - 0, 0, 639, 639, 0, 0, 0, 0, 0, 0, - 639, 639, 56, 24, 639, 25, 0, 639, 26, 253, - 0, 0, 639, 27, 61, 62, 0, 28, 0, 0, - 0, 0, 0, 64, 0, 0, 30, 0, 0, 0, - 0, 0, 0, 32, 639, 639, 0, 0, 33, 0, - 71, 72, 34, 0, 0, 0, 0, 639, 0, 0, - 0, 0, 0, 0, 36, 0, 37, 74, 0, 0, - 38, 0, 0, 76, 0, 78, 0, 80, 39, 40, - 254, 0, 41, 0, 0, 84, 0, 0, 0, 0, - 0, 0, 24, 0, 25, 0, 0, 26, 639, 1218, - 0, 0, 27, 0, 0, 0, 28, 89, 90, 91, - 255, 0, 0, 0, 0, 30, 638, 0, 638, 95, - 0, 638, 32, 638, 638, 0, 638, 33, 638, 1219, - 638, 34, 638, 638, 638, 0, 0, 0, 638, 638, - 0, 0, 0, 36, 638, 37, 638, 638, 0, 38, - 1220, 638, 0, 0, 0, 638, 0, 39, 40, 0, - 0, 41, 0, 0, 319, 105, 256, 638, 0, 638, - 0, 0, 0, 638, 638, 0, 0, 0, 0, 0, - 0, 638, 638, 0, 638, 638, 638, 0, 638, 638, - 0, 638, 638, 638, 638, 0, 638, 0, 638, 0, - 638, 638, 638, 0, 0, 0, 638, 638, 0, 0, - 0, 0, 638, 0, 638, 638, 0, 0, 0, 638, - 0, 0, 0, 638, 0, 0, 0, 0, 638, 0, - 0, 0, 0, 0, 0, 638, 0, 638, 0, 0, - 0, 638, 638, 0, 0, 352, 0, 0, 0, 638, - 638, 0, 0, 638, 0, 0, 638, 0, 24, 0, - 25, 638, 0, 26, 0, 0, 1280, 0, 27, 638, - 678, 0, 28, 0, 679, 1281, 1282, 0, 0, 0, - 1283, 30, 0, 0, 0, 0, 1284, 0, 32, 0, - 24, 0, 25, 33, 0, 26, 0, 34, 1280, 0, - 27, 0, 678, 0, 28, 0, 679, 1281, 1282, 36, - 0, 37, 1283, 30, 0, 38, 0, 0, 1284, 0, - 32, 0, 0, 39, 40, 33, 0, 41, 0, 34, - 1285, 0, 0, 0, 47, 1286, 47, 638, 0, 47, - 0, 36, 0, 37, 47, 0, 0, 38, 47, 0, - 0, 0, 0, 0, 0, 39, 40, 47, 0, 41, - 0, 0, 1285, 0, 47, 0, 47, 1286, 47, 47, - 1287, 47, 0, 47, 0, 47, 47, 47, 0, 0, - 47, 0, 47, 0, 0, 47, 0, 47, 0, 47, - 0, 47, 0, 0, 47, 0, 47, 0, 0, 47, - 47, 47, 0, 47, 0, 47, 47, 47, 0, 47, - 47, 1288, 47, 0, 47, 47, 0, 47, 0, 47, - 47, 0, 0, 47, 47, 0, 47, 0, 0, 0, - 0, 47, 47, 47, 0, 47, 0, 0, 47, 0, - 47, 154, 24, 1288, 25, 47, 0, 26, 0, 47, - 0, 47, 27, 47, 0, 0, 28, 0, 47, 0, - 0, 47, 0, 47, 0, 30, 0, 47, 0, 0, - 47, 154, 32, 0, 0, 47, 47, 33, 0, 47, - 0, 34, 47, 565, 0, 0, 24, 47, 25, 0, - 566, 26, 0, 36, 0, 37, 27, 0, 0, 38, - 28, 0, 567, 0, 0, 0, 0, 39, 40, 30, - 0, 41, 0, 0, 568, 0, 32, 0, 0, 47, - 0, 33, 0, 0, 0, 34, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 487, 36, 487, 37, - 0, 487, 0, 38, 0, 0, 487, 0, 0, 0, - 487, 39, 40, 0, 0, 41, 0, 0, 319, 487, - 0, 0, 0, 47, 0, 0, 487, 0, 174, 0, - 174, 487, 0, 174, 0, 487, 0, 0, 174, 0, - 0, 0, 174, 0, 290, 0, 0, 487, 0, 487, - 0, 174, 0, 487, 0, 569, 0, 0, 174, 0, - 0, 487, 487, 174, 0, 487, 0, 174, 487, 0, - 0, 0, 173, 0, 173, 0, 0, 173, 0, 174, - 0, 174, 173, 0, 0, 174, 173, 0, 0, 0, - 0, 0, 0, 174, 174, 173, 0, 174, 0, 320, - 174, 0, 173, 0, 183, 0, 183, 173, 0, 183, - 0, 173, 0, 0, 183, 0, 0, 0, 183, 0, - 0, 0, 0, 173, 0, 173, 0, 183, 0, 173, - 0, 0, 0, 0, 183, 0, 0, 173, 173, 183, - 0, 173, 33, 183, 173, 0, 0, 0, 0, 487, - 0, 0, 0, 33, 0, 183, 0, 183, 33, 0, - 0, 183, 33, 0, 0, 33, 0, 0, 0, 183, - 183, 0, 0, 183, 0, 0, 183, 33, 33, 0, - 0, 174, 33, 33, 0, 0, 0, 0, 33, 0, - 33, 33, 33, 33, 0, 0, 0, 0, 33, 0, - 0, 0, 33, 0, 33, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 33, 0, 33, 33, 31, 33, - 0, 0, 0, 33, 0, 173, 0, 0, 0, 31, - 0, 0, 0, 0, 31, 0, 0, 0, 31, 0, - 0, 31, 0, 33, 0, 0, 0, 0, 0, 33, - 33, 0, 0, 31, 31, 0, 0, 183, 31, 31, - 0, 47, 0, 0, 31, 0, 31, 31, 31, 31, - 0, 0, 47, 0, 31, 0, 0, 47, 31, 0, - 31, 47, 0, 0, 47, 0, 0, 0, 0, 0, - 31, 0, 0, 31, 0, 31, 47, 47, 0, 31, - 0, 47, 47, 0, 47, 0, 0, 47, 0, 47, - 47, 47, 47, 0, 0, 47, 0, 47, 0, 31, - 47, 47, 0, 47, 47, 31, 31, 47, 0, 0, - 0, 0, 0, 47, 0, 0, 47, 0, 47, 47, - 47, 0, 47, 0, 47, 47, 47, 0, 0, 0, - 47, 0, 47, 47, 47, 47, 0, 0, 0, 0, - 47, 0, 47, 0, 47, 0, 47, 0, 35, 47, - 0, 0, 0, 0, 0, 0, 47, 0, 0, 47, - 0, 47, 47, 0, 47, 47, 0, 47, 0, 0, - 0, 0, 47, 0, 47, 47, 47, 47, 0, 0, - 0, 0, 47, 0, 0, 47, 47, 47, 0, 0, - 0, 36, 0, 0, 0, 0, 0, 0, 47, 0, - 47, 47, 47, 47, 0, 47, 0, 0, 0, 0, - 47, 0, 47, 47, 47, 47, 0, 0, 0, 0, - 47, 0, 0, 0, 47, 47, 0, 47, 0, 47, - 47, 0, 0, 195, 0, 0, 47, 0, 47, 47, - 47, 47, 47, 47, 0, 0, 0, 0, 47, 0, - 47, 47, 47, 47, 0, 0, 47, 0, 47, 0, - 0, 0, 47, 47, 0, 47, 0, 47, 47, 0, - 0, 197, 0, 0, 47, 0, 47, 47, 47, 47, + 0, 77, 77, 77, 77, 77, 0, 0, 0, 0, + 0, 0, 0, 77, 0, 0, 0, 0, 0, 77, + 77, 77, 77, 0, 0, 0, 77, 0, 77, 0, + 0, 0, 0, 0, 77, 77, 0, 0, 0, 0, + 0, 0, 135, 135, 0, 135, 0, 0, 135, 135, + 0, 0, 0, 135, 135, 135, 0, 135, 0, 77, + 77, 77, 77, 135, 0, 0, 135, 0, 0, 0, + 0, 0, 0, 135, 0, 0, 0, 0, 135, 0, + 135, 135, 135, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 135, 0, 135, 135, 0, 0, + 135, 0, 0, 135, 0, 135, 0, 135, 135, 135, + 135, 0, 135, 0, 0, 0, 0, 0, 0, 135, + 0, 0, 135, 135, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 135, 135, 135, + 135, 135, 0, 0, 0, 0, 0, 0, 0, 135, + 0, 0, 0, 0, 0, 135, 135, 135, 135, 0, + 0, 0, 135, 0, 135, 0, 0, 0, 0, 0, + 135, 135, 0, 0, 0, 0, 0, 0, 56, 24, + 0, 25, 0, 0, 26, 253, 0, 0, 0, 27, + 61, 62, 0, 28, 0, 135, 135, 135, 135, 64, + 0, 0, 30, 0, 0, 0, 0, 0, 0, 32, + 0, 27, 0, 0, 33, 0, 71, 72, 34, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 36, 0, 37, 74, 27, 0, 38, 0, 0, 76, + 0, 78, 0, 80, 39, 40, 254, 27, 41, 0, + 0, 0, 27, 0, 0, 0, 0, 27, 0, 27, + 27, 27, 27, 0, 0, 27, 0, 27, 0, 0, + 0, 27, 0, 89, 90, 91, 255, 302, 0, 0, + 0, 0, 0, 27, 0, 95, 27, 0, 27, 0, + 0, 97, 98, 99, 100, 0, 0, 0, 101, 0, + 102, 0, 0, 0, 0, 0, 103, 104, 0, 0, + 0, 0, 27, 0, 0, 0, 0, 0, 27, 27, + 0, 0, 0, 0, 0, 0, 641, 0, 641, 0, + 641, 105, 256, 641, 108, 641, 641, 0, 641, 0, + 641, 0, 641, 0, 641, 641, 641, 0, 0, 0, + 641, 641, 0, 0, 0, 0, 641, 0, 641, 641, + 0, 0, 0, 641, 0, 0, 0, 641, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 641, 641, + 0, 641, 0, 0, 0, 641, 641, 0, 0, 0, + 0, 0, 0, 641, 641, 56, 24, 641, 25, 0, + 641, 26, 253, 0, 0, 641, 27, 61, 62, 0, + 28, 0, 0, 0, 0, 0, 64, 0, 0, 30, + 0, 0, 0, 0, 0, 0, 32, 641, 641, 0, + 0, 33, 0, 71, 72, 34, 0, 0, 0, 0, + 641, 0, 0, 0, 0, 0, 0, 36, 0, 37, + 74, 0, 0, 38, 0, 0, 76, 0, 78, 0, + 80, 39, 40, 254, 0, 41, 0, 0, 84, 0, + 0, 0, 0, 0, 0, 24, 0, 25, 0, 0, + 26, 641, 1228, 0, 0, 27, 0, 0, 0, 28, + 89, 90, 91, 255, 0, 0, 0, 0, 30, 640, + 0, 640, 95, 0, 640, 32, 640, 640, 0, 640, + 33, 640, 1229, 640, 34, 640, 640, 640, 0, 0, + 0, 640, 640, 0, 0, 0, 36, 640, 37, 640, + 640, 0, 38, 1230, 640, 0, 0, 0, 640, 0, + 39, 40, 0, 0, 41, 0, 0, 322, 105, 256, + 640, 0, 640, 0, 0, 0, 640, 640, 0, 0, + 0, 0, 0, 0, 640, 640, 0, 640, 640, 640, + 0, 640, 640, 0, 640, 640, 640, 640, 0, 640, + 0, 640, 0, 640, 640, 640, 0, 0, 0, 640, + 640, 0, 0, 0, 0, 640, 0, 640, 640, 0, + 0, 0, 640, 0, 0, 0, 640, 0, 0, 0, + 0, 640, 0, 0, 0, 0, 0, 0, 640, 0, + 640, 0, 0, 0, 640, 640, 0, 0, 355, 0, + 0, 0, 640, 640, 0, 0, 640, 0, 0, 640, + 0, 24, 0, 25, 640, 0, 26, 0, 0, 1290, + 0, 27, 640, 686, 0, 28, 0, 687, 1291, 1292, + 0, 0, 0, 1293, 30, 0, 0, 0, 0, 1294, + 0, 32, 0, 24, 0, 25, 33, 0, 26, 0, + 34, 1290, 0, 27, 0, 686, 0, 28, 0, 687, + 1291, 1292, 36, 0, 37, 1293, 30, 0, 38, 0, + 0, 1294, 0, 32, 0, 0, 39, 40, 33, 0, + 41, 0, 34, 1295, 0, 0, 0, 47, 1296, 47, + 640, 0, 47, 0, 36, 0, 37, 47, 0, 0, + 38, 47, 0, 0, 0, 0, 0, 0, 39, 40, + 47, 0, 41, 0, 0, 1295, 0, 47, 0, 47, + 1296, 47, 47, 1297, 47, 0, 47, 0, 47, 47, + 47, 0, 0, 47, 0, 47, 0, 0, 47, 0, + 47, 0, 47, 0, 47, 0, 0, 47, 0, 47, + 0, 0, 47, 47, 47, 0, 47, 0, 47, 47, + 47, 0, 47, 48, 1298, 48, 0, 47, 48, 0, + 47, 0, 47, 48, 0, 0, 47, 48, 0, 47, + 0, 0, 0, 0, 47, 47, 48, 0, 47, 0, + 0, 47, 0, 48, 154, 47, 1298, 47, 48, 0, + 47, 0, 48, 0, 48, 47, 48, 0, 0, 47, + 0, 48, 0, 0, 48, 0, 48, 0, 47, 0, + 48, 0, 0, 48, 154, 47, 0, 0, 48, 48, + 47, 0, 48, 0, 47, 48, 47, 0, 47, 24, + 47, 25, 0, 47, 26, 0, 47, 0, 47, 27, + 0, 0, 47, 28, 0, 47, 0, 0, 0, 0, + 47, 47, 30, 0, 47, 0, 0, 47, 0, 32, + 0, 0, 47, 0, 33, 0, 0, 0, 34, 0, + 570, 0, 0, 0, 24, 0, 25, 571, 0, 26, + 36, 0, 37, 0, 27, 0, 38, 0, 28, 572, + 0, 0, 29, 0, 39, 40, 0, 30, 41, 0, + 0, 573, 31, 0, 32, 0, 48, 0, 0, 33, + 0, 0, 0, 34, 35, 0, 0, 0, 24, 0, + 25, 0, 0, 26, 0, 36, 0, 37, 27, 0, + 0, 38, 28, 0, 0, 0, 0, 0, 47, 39, + 40, 30, 174, 41, 174, 0, 0, 174, 32, 0, + 0, 0, 174, 33, 0, 0, 174, 34, 0, 0, + 0, 0, 0, 0, 0, 174, 0, 0, 0, 36, + 0, 37, 174, 0, 0, 38, 0, 174, 0, 0, + 0, 174, 574, 39, 40, 0, 0, 41, 0, 0, + 322, 0, 0, 174, 0, 174, 184, 0, 184, 174, + 0, 184, 0, 0, 0, 0, 184, 174, 174, 0, + 184, 174, 0, 0, 174, 0, 291, 0, 0, 184, + 0, 0, 0, 0, 0, 0, 184, 42, 0, 0, + 0, 184, 0, 0, 33, 184, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 33, 0, 184, 0, 184, + 33, 0, 0, 184, 33, 0, 0, 33, 0, 0, + 0, 184, 184, 0, 0, 184, 0, 0, 184, 33, + 33, 323, 0, 0, 33, 33, 0, 0, 0, 0, + 33, 0, 33, 33, 33, 33, 0, 0, 0, 0, + 33, 0, 0, 0, 33, 174, 33, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 33, 0, 33, 33, + 31, 33, 0, 0, 0, 33, 0, 0, 0, 0, + 0, 31, 0, 0, 0, 0, 31, 0, 0, 0, + 31, 0, 0, 31, 0, 33, 0, 0, 0, 0, + 0, 33, 33, 0, 0, 31, 31, 0, 0, 184, + 31, 31, 27, 0, 27, 0, 31, 0, 31, 31, + 31, 31, 0, 0, 0, 0, 31, 0, 0, 0, + 31, 0, 31, 0, 0, 27, 0, 0, 0, 0, + 0, 0, 31, 0, 0, 31, 0, 31, 27, 0, + 0, 31, 0, 27, 0, 0, 0, 0, 27, 0, + 27, 27, 27, 27, 0, 0, 0, 0, 27, 0, + 0, 31, 27, 0, 0, 47, 0, 31, 31, 0, + 0, 0, 0, 0, 27, 0, 47, 27, 0, 27, + 0, 47, 0, 0, 0, 47, 0, 0, 47, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 47, 47, 0, 27, 0, 47, 47, 0, 47, 27, + 27, 47, 0, 47, 47, 47, 47, 0, 0, 47, + 0, 47, 0, 0, 47, 47, 0, 47, 47, 0, + 0, 47, 0, 0, 0, 0, 0, 47, 0, 0, + 47, 0, 47, 47, 47, 0, 47, 0, 47, 47, + 47, 0, 0, 0, 47, 0, 47, 47, 47, 47, + 0, 0, 0, 0, 47, 0, 47, 0, 47, 0, + 47, 0, 35, 47, 0, 0, 0, 0, 0, 0, + 47, 0, 0, 47, 0, 47, 47, 0, 47, 47, 0, 47, 0, 0, 0, 0, 47, 0, 47, 47, - 47, 47, 0, 0, 0, 0, 47, 0, 0, 0, - 47, 47, 0, 47, 0, 0, 0, 0, 47, 298, - 47, 0, 47, 0, 47, 47, 0, 47, 0, 47, + 47, 47, 0, 0, 0, 0, 47, 0, 0, 47, + 47, 47, 0, 0, 0, 36, 0, 0, 0, 0, + 0, 0, 47, 0, 47, 47, 47, 47, 0, 47, 0, 0, 0, 0, 47, 0, 47, 47, 47, 47, - 0, 47, 0, 0, 47, 0, 0, 0, 47, 0, - 0, 47, 0, 0, 47, 0, 0, 299, 448, 47, - 47, 0, 0, 47, 47, 47, 47, 47, 47, 47, - 0, 0, 47, 0, 47, 0, 0, 0, 47, 0, - 0, 449, 0, 0, 0, 0, 0, 0, 448, 47, - 47, 47, 47, 47, 450, 47, 0, 0, 451, 452, - 0, 0, 0, 0, 453, 0, 454, 455, 456, 457, - 0, 449, 0, 0, 458, 0, 0, 0, 459, 47, - 0, 0, 0, 0, 450, 0, 0, 0, 0, 452, - 460, 0, 0, 461, 453, 462, 454, 455, 456, 457, - 0, 0, 0, 0, 458, 0, 0, 0, 459, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 463, - 460, 0, 0, 461, 0, 462, 0, 0, 0, 0, + 0, 0, 0, 0, 47, 0, 0, 0, 47, 47, + 0, 47, 0, 47, 47, 0, 0, 196, 0, 0, + 47, 0, 47, 47, 47, 47, 47, 47, 0, 0, + 0, 0, 47, 0, 47, 47, 47, 47, 0, 0, + 47, 0, 47, 0, 0, 0, 47, 47, 0, 47, + 0, 47, 47, 0, 0, 198, 0, 0, 47, 0, + 47, 47, 47, 47, 47, 47, 0, 0, 0, 0, + 47, 0, 47, 47, 47, 47, 0, 0, 0, 0, + 47, 0, 0, 0, 47, 47, 0, 47, 0, 0, + 0, 0, 453, 299, 0, 0, 47, 0, 47, 47, + 0, 47, 0, 47, 0, 0, 0, 0, 47, 0, + 47, 47, 47, 47, 0, 454, 47, 0, 47, 0, + 0, 0, 47, 0, 453, 47, 0, 0, 455, 0, + 0, 300, 456, 457, 47, 0, 0, 47, 458, 47, + 459, 460, 461, 462, 0, 0, 0, 454, 463, 0, + 0, 0, 464, 0, 0, 0, 0, 0, 0, 0, + 455, 0, 0, 47, 465, 457, 0, 466, 0, 467, + 458, 0, 459, 460, 461, 462, 0, 0, 0, 0, + 463, 0, 0, 0, 464, 0, 0, 0, 0, 0, + 0, 0, 0, 468, 0, 0, 465, 0, 0, 466, + 0, 467, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 463, + 0, 0, 0, 0, 0, 468, }; protected static readonly short [] yyCheck = { 17, - 4, 17, 299, 17, 51, 511, 6, 18, 513, 298, - 51, 189, 234, 288, 17, 232, 247, 465, 188, 487, - 59, 297, 318, 554, 20, 84, 157, 1100, 329, 351, - 336, 295, 922, 77, 0, 47, 256, 1136, 1137, 771, - 59, 738, 571, 256, 58, 87, 88, 256, 579, 325, - 268, 256, 256, 256, 113, 73, 115, 17, 256, 77, - 17, 277, 256, 256, 256, 79, 108, 81, 256, 256, - 68, 256, 712, 113, 714, 115, 256, 95, 61, 256, - 256, 351, 65, 66, 67, 1184, 69, 70, 268, 87, - 88, 74, 75, 294, 92, 256, 268, 282, 81, 1225, - 83, 335, 85, 256, 268, 306, 256, 90, 91, 263, - 257, 256, 276, 256, 325, 17, 927, 1243, 758, 17, - 1183, 761, 191, 17, 371, 17, 877, 256, 657, 314, - 0, 114, 408, 376, 256, 366, 368, 888, 374, 157, - 1203, 157, 189, 157, 376, 343, 339, 363, 189, 294, - 363, 344, 256, 346, 157, 20, 0, 199, 200, 352, - 353, 315, 367, 339, 369, 59, 371, 256, 344, 63, - 346, 358, 256, 420, 172, 17, 352, 353, 381, 367, - 416, 17, 17, 17, 256, 232, 429, 340, 376, 17, - 256, 232, 256, 391, 256, 429, 368, 157, 418, 363, - 157, 17, 418, 419, 422, 418, 507, 418, 430, 418, - 715, 223, 429, 305, 418, 420, 414, 418, 423, 261, - 381, 510, 87, 88, 418, 375, 418, 549, 228, 247, - 428, 1294, 375, 418, 252, 1298, 429, 424, 425, 426, - 427, 418, 422, 108, 1055, 287, 285, 369, 554, 247, - 422, 320, 381, 429, 418, 157, 295, 527, 317, 157, - 1323, 259, 321, 157, 306, 157, 285, 326, 372, 257, - 288, 254, 899, 579, 257, 293, 294, 1403, 367, 549, - 1012, 256, 371, 352, 373, 374, 326, 376, 357, 307, - 374, 257, 381, 256, 312, 314, 314, 325, 370, 313, - 318, 571, 374, 418, 1430, 256, 348, 371, 374, 374, - 372, 355, 330, 331, 297, 157, 1442, 372, 1444, 1095, - 336, 157, 157, 157, 1397, 323, 415, 310, 857, 157, - 328, 256, 1029, 336, 199, 200, 658, 355, 256, 256, - 372, 157, 256, 385, 386, 985, 1078, 256, 366, 367, - 372, 416, 374, 371, 372, 373, 374, 375, 376, 377, - 378, 379, 380, 381, 1463, 256, 435, 358, 366, 367, - 372, 413, 414, 256, 429, 305, 256, 1004, 341, 1006, - 256, 368, 429, 372, 889, 403, 256, 657, 429, 376, - 418, 285, 439, 1283, 1493, 370, 261, 429, 368, 374, - 868, 470, 349, 350, 700, 780, 369, 429, 678, 262, - 256, 335, 363, 257, 266, 413, 414, 415, 256, 370, - 314, 372, 287, 374, 436, 437, 368, 429, 272, 305, - 442, 806, 654, 277, 299, 431, 266, 281, 349, 350, - 429, 306, 336, 369, 369, 298, 821, 822, 418, 445, - 367, 369, 296, 717, 371, 686, 373, 374, 372, 376, - 369, 269, 314, 785, 381, 418, 480, 418, 487, 339, - 1110, 368, 349, 350, 979, 428, 277, 1117, 286, 323, - 281, 372, 429, 348, 314, 367, 351, 429, 486, 372, - 488, 509, 372, 511, 376, 513, 368, 367, 342, 482, - 569, 371, 1142, 373, 374, 375, 376, 368, 368, 523, - 524, 381, 581, 511, 583, 785, 585, 368, 429, 537, - 385, 386, 368, 375, 542, 378, 379, 256, 374, 527, - 368, 527, 429, 531, 856, 264, 374, 376, 554, 256, - 523, 342, 368, 1432, 1433, 375, 371, 561, 413, 414, - 376, 554, 429, 1209, 929, 1195, 931, 429, 933, 1335, - 263, 363, 372, 579, 374, 854, 431, 369, 429, 429, - 588, 589, 570, 256, 805, 256, 579, 272, 429, 648, - 445, 882, 277, 21, 391, 363, 281, 857, 1364, 1365, - 363, 1367, 368, 487, 363, 726, 325, 363, 1254, 668, - 1489, 296, 1378, 429, 367, 1381, 373, 414, 372, 376, - 886, 376, 315, 376, 52, 1146, 418, 635, 343, 429, - 1396, 428, 339, 641, 305, 922, 272, 344, 323, 346, - 347, 348, 349, 350, 351, 352, 353, 354, 355, 637, - 418, 639, 418, 343, 1420, 418, 1021, 342, 1023, 418, - 296, 368, 418, 370, 418, 372, 339, 374, 375, 376, - 554, 344, 527, 346, 373, 1209, 391, 376, 686, 352, - 353, 343, 1209, 1209, 272, 1143, 369, 323, 717, 679, - 373, 381, 700, 272, 549, 579, 982, 341, 686, 414, - 749, 391, 1209, 363, 357, 1209, 367, 715, 296, 369, - 371, 743, 720, 428, 702, 994, 571, 296, 369, 381, - 1254, 418, 429, 1088, 414, 369, 947, 1254, 1254, 391, - 381, 428, 339, 386, 766, 323, 59, 344, 428, 346, - 423, 745, 349, 350, 323, 352, 353, 1254, 256, 781, - 1254, 381, 414, 357, 1209, 763, 1121, 765, 418, 420, - 1209, 391, 1208, 1209, 752, 769, 428, 771, 370, 373, - 93, 371, 780, 373, 97, 98, 99, 100, 101, 102, - 103, 104, 386, 1229, 414, 387, 388, 339, 1153, 372, - 414, 357, 800, 376, 831, 386, 784, 805, 806, 1254, - 808, 1066, 657, 369, 428, 1254, 372, 373, 1254, 381, - 1256, 391, 800, 821, 822, 367, 1301, 805, 1114, 391, - 386, 1100, 429, 678, 376, 401, 858, 256, 712, 1314, - 714, 376, 1197, 414, 414, 823, 357, 413, 1103, 898, - 269, 367, 414, 339, 852, 339, 854, 428, 1333, 1214, - 1146, 371, 373, 839, 844, 421, 428, 286, 980, 367, - 368, 369, 870, 371, 372, 386, 374, 1027, 376, 877, - 418, 367, 1093, 367, 758, 1140, 1314, 761, 379, 887, - 357, 889, 306, 1179, 308, 368, 1008, 357, 743, 313, - 1385, 374, 373, 363, 294, 376, 373, 6, 381, 369, - 384, 325, 372, 373, 374, 893, 306, 895, 17, 386, - 418, 766, 420, 901, 389, 423, 386, 306, 382, 383, - 952, 929, 367, 931, 313, 933, 781, 394, 395, 367, - 785, 376, 396, 397, 367, 368, 325, 925, 376, 947, - 367, 372, 369, 376, 1003, 376, 367, 368, 418, 1156, - 59, 1216, 1447, 306, 63, 376, 367, 294, 944, 947, - 313, 368, 285, 1131, 954, 376, 956, 374, 958, 376, - 369, 979, 295, 372, 982, 963, 367, 300, 87, 88, - 371, 339, 373, 374, 839, 376, 344, 385, 346, 1484, - 381, 349, 350, 339, 352, 353, 1283, 368, 344, 108, - 346, 372, 857, 858, 1264, 376, 352, 353, 1012, 390, - 1506, 1507, 1272, 1021, 1226, 1023, 374, 1025, 370, 368, - 357, 400, 374, 372, 415, 374, 363, 376, 398, 399, - 370, 371, 369, 368, 374, 372, 373, 372, 374, 374, - 376, 376, 1036, 369, 371, 381, 373, 370, 157, 386, - 370, 371, 370, 373, 374, 375, 374, 418, 1066, 382, - 383, 384, 367, 368, 387, 388, 372, 922, 374, 371, - 376, 429, 1080, 1081, 1078, 370, 415, 372, 370, 374, - 1088, 418, 374, 277, 421, 1093, 372, 261, 374, 944, - 199, 200, 1100, 1094, 1131, 1103, 1133, 952, 376, 370, - 1131, 985, 370, 374, 372, 1093, 374, 372, 1114, 418, - 284, 376, 372, 1121, 418, 372, 376, 374, 1397, 1156, - 1128, 1114, 370, 297, 256, 1156, 374, 370, 302, 372, - 372, 305, 1140, 307, 376, 309, 310, 311, 312, 374, - 1146, 376, 376, 317, 372, 1153, 1154, 321, 376, 367, - 1187, 325, 261, 1146, 373, 370, 339, 372, 372, 333, - 374, 344, 336, 346, 338, 376, 349, 350, 376, 352, - 353, 1208, 1209, 1179, 294, 1207, 285, 1208, 287, 391, - 392, 393, 394, 386, 387, 388, 1179, 294, 362, 1197, - 299, 374, 1229, 370, 370, 372, 372, 306, 1229, 372, - 0, 374, 339, 368, 369, 314, 1214, 344, 1216, 346, - 354, 355, 349, 350, 343, 352, 353, 1254, 370, 1256, - 372, 370, 372, 372, 414, 1256, 1110, 336, 376, 1288, - 1114, 1263, 374, 1117, 376, 374, 374, 376, 376, 348, - 418, 374, 351, 376, 418, 369, 429, 418, 1280, 1281, - 354, 355, 1311, 576, 368, 369, 414, 415, 1142, 364, - 365, 418, 1146, 375, 1268, 376, 1325, 349, 350, 1257, - 372, 1303, 372, 373, 1306, 372, 385, 386, 368, 1134, - 364, 365, 374, 339, 1343, 372, 1345, 372, 344, 294, - 346, 294, 429, 349, 350, 1179, 352, 353, 374, 1098, - 1099, 389, 390, 372, 413, 414, 395, 396, 372, 374, - 261, 1195, 372, 376, 371, 1319, 256, 93, 294, 374, - 294, 97, 98, 99, 100, 101, 102, 103, 104, 375, - 381, 356, 372, 284, 1189, 374, 373, 375, 1375, 0, - 374, 373, 372, 418, 423, 381, 297, 374, 374, 429, - 374, 302, 1207, 374, 305, 1392, 307, 372, 309, 310, - 311, 312, 374, 367, 372, 372, 317, 421, 1405, 1406, - 321, 373, 343, 429, 325, 374, 294, 1385, 487, 1383, - 294, 374, 333, 418, 370, 336, 371, 338, 367, 1397, - 418, 375, 256, 256, 717, 1432, 1433, 374, 368, 256, - 256, 371, 280, 373, 374, 256, 1414, 367, 1263, 1264, - 368, 362, 381, 372, 371, 343, 373, 1272, 527, 371, - 370, 376, 392, 393, 372, 1280, 1281, 374, 1283, 374, - 376, 370, 423, 256, 1289, 392, 393, 372, 372, 1447, - 549, 347, 412, 381, 351, 554, 1301, 367, 1303, 381, - 420, 1306, 1489, 423, 381, 412, 372, 257, 256, 1314, - 368, 261, 571, 420, 347, 374, 423, 418, 370, 370, - 579, 375, 272, 370, 372, 375, 1484, 277, 1333, 339, - 348, 281, 368, 374, 284, 0, 1490, 1491, 418, 418, - 372, 376, 368, 1497, 1498, 348, 296, 297, 1506, 1507, - 367, 301, 302, 368, 381, 367, 367, 307, 261, 309, - 310, 311, 312, 356, 368, 374, 371, 317, 1506, 1507, - 368, 321, 368, 323, 300, 371, 376, 373, 374, 368, - 372, 284, 337, 333, 305, 371, 336, 418, 338, 418, - 369, 367, 342, 418, 297, 418, 392, 393, 657, 302, - 371, 376, 418, 329, 307, 371, 309, 310, 311, 312, - 371, 381, 362, 373, 317, 371, 412, 371, 321, 678, - 367, 372, 325, 381, 420, 369, 371, 423, 374, 372, - 333, 373, 373, 336, 374, 338, 374, 256, 374, 376, - 418, 372, 372, 370, 370, 256, 418, 376, 376, 418, - 372, 262, 376, 712, 418, 714, 382, 383, 384, 362, - 372, 387, 388, 389, 390, 391, 392, 393, 394, 395, - 396, 397, 398, 399, 400, 401, 402, 381, 367, 372, - 368, 381, 372, 370, 743, 368, 315, 298, 263, 371, - 371, 368, 372, 372, 0, 0, 367, 372, 376, 758, - 368, 0, 761, 368, 418, 372, 372, 766, 370, 367, - 370, 0, 368, 368, 367, 418, 418, 418, 372, 376, - 368, 372, 781, 372, 376, 368, 785, 368, 339, 367, - 372, 368, 372, 344, 368, 346, 347, 348, 349, 350, - 351, 352, 353, 354, 355, 356, 357, 367, 376, 373, - 376, 376, 363, 376, 376, 376, 367, 368, 369, 370, - 371, 372, 373, 374, 375, 376, 376, 378, 379, 376, - 376, 382, 383, 384, 385, 386, 315, 263, 389, 390, - 50, 507, 12, 394, 395, 396, 397, 398, 399, 400, - 401, 256, 5, 944, 839, 1093, 261, 262, 857, 858, - 381, 1093, 413, 1256, 1400, 416, 1229, 418, 1437, 420, - 1388, 678, 423, 1417, 1453, 1383, 1289, 860, 429, 284, - 692, 402, 403, 404, 405, 406, 407, 408, 409, 410, - 411, 1498, 297, 298, 1301, 856, 860, 302, 860, 1254, - 305, 1320, 307, 1242, 309, 310, 311, 312, 1492, 1410, - 576, 1406, 317, 1491, 1405, 1187, 321, 1345, 831, 1289, - 325, 0, 1189, 922, 527, 882, 805, 720, 333, 800, - 589, 336, 366, 338, 339, 994, 71, 717, 686, 344, - 332, 346, 347, 348, 349, 350, 351, 352, 353, 354, - 355, 356, 397, 952, 398, 401, 399, 362, 363, 400, - 402, 1168, 367, 368, 785, 370, 371, 372, 373, 374, - 375, 376, 1263, 378, 379, 1179, 381, 382, 383, 384, - 385, 386, 387, 388, 389, 390, 985, 392, 393, 394, + 516, 4, 51, 17, 300, 234, 6, 51, 18, 189, + 247, 17, 518, 17, 354, 470, 289, 188, 232, 299, + 84, 68, 20, 492, 339, 59, 321, 157, 559, 332, + 354, 59, 780, 296, 298, 747, 645, 646, 576, 934, + 87, 88, 87, 88, 58, 92, 1145, 1146, 47, 113, + 1110, 115, 191, 584, 0, 73, 721, 77, 723, 77, + 256, 1235, 17, 108, 328, 79, 256, 81, 939, 256, + 113, 256, 115, 256, 256, 256, 325, 95, 268, 1253, + 256, 256, 363, 1193, 256, 277, 282, 372, 369, 374, + 256, 256, 335, 256, 256, 1194, 368, 256, 17, 256, + 17, 17, 767, 1213, 1219, 770, 256, 17, 256, 256, + 268, 1442, 1443, 268, 376, 371, 382, 383, 314, 418, + 394, 395, 370, 371, 414, 172, 374, 665, 17, 428, + 396, 397, 369, 17, 17, 0, 1105, 418, 428, 157, + 189, 17, 17, 157, 429, 189, 418, 411, 17, 1264, + 17, 157, 339, 157, 199, 200, 257, 344, 256, 346, + 343, 294, 349, 350, 420, 352, 353, 429, 1499, 418, + 59, 363, 256, 306, 63, 256, 256, 268, 363, 256, + 789, 256, 358, 232, 323, 276, 429, 374, 232, 256, + 256, 256, 532, 340, 1304, 1066, 0, 372, 1308, 381, + 247, 367, 157, 369, 363, 371, 435, 816, 391, 512, + 368, 370, 259, 372, 554, 374, 355, 262, 724, 381, + 434, 360, 418, 1333, 223, 375, 418, 419, 228, 247, + 554, 414, 422, 418, 252, 515, 576, 418, 157, 1413, + 157, 157, 429, 288, 559, 428, 418, 157, 424, 425, + 426, 427, 286, 418, 420, 418, 320, 423, 286, 418, + 324, 418, 296, 308, 422, 329, 1440, 422, 157, 584, + 418, 289, 363, 157, 157, 1023, 294, 295, 1452, 326, + 1454, 157, 157, 381, 331, 418, 329, 367, 157, 317, + 157, 309, 376, 256, 375, 256, 376, 315, 375, 317, + 375, 440, 316, 321, 370, 370, 351, 374, 374, 374, + 910, 257, 256, 256, 256, 333, 334, 256, 256, 358, + 256, 372, 369, 370, 372, 665, 256, 418, 1040, 867, + 372, 996, 941, 339, 943, 339, 475, 946, 358, 368, + 358, 1089, 666, 388, 389, 256, 686, 1407, 325, 256, + 262, 369, 370, 368, 363, 368, 374, 375, 376, 377, + 378, 379, 380, 381, 382, 383, 384, 357, 263, 416, + 417, 416, 417, 420, 1473, 256, 1345, 256, 429, 374, + 257, 429, 256, 373, 256, 434, 298, 429, 406, 374, + 434, 256, 20, 367, 900, 444, 386, 286, 1293, 341, + 429, 363, 376, 418, 1503, 1374, 1375, 368, 1377, 418, + 879, 374, 294, 374, 709, 1015, 429, 1017, 368, 1388, + 315, 416, 1391, 1032, 368, 1034, 1035, 369, 317, 372, + 374, 416, 371, 662, 372, 574, 372, 1406, 436, 369, + 484, 418, 441, 442, 491, 256, 493, 586, 447, 588, + 339, 590, 450, 257, 794, 1120, 418, 694, 369, 87, + 88, 1430, 1127, 726, 492, 372, 378, 379, 272, 516, + 794, 485, 701, 277, 339, 357, 256, 281, 277, 429, + 108, 363, 281, 266, 990, 532, 1151, 369, 369, 536, + 372, 373, 296, 372, 263, 369, 514, 369, 516, 266, + 518, 372, 367, 343, 386, 368, 371, 368, 373, 374, + 375, 376, 368, 376, 528, 529, 381, 656, 368, 323, + 341, 256, 1131, 401, 542, 306, 370, 867, 575, 547, + 374, 314, 313, 294, 532, 413, 418, 676, 342, 421, + 1205, 381, 866, 342, 363, 306, 315, 314, 369, 256, + 369, 391, 566, 559, 1163, 559, 367, 363, 429, 294, + 371, 256, 373, 374, 256, 376, 429, 256, 429, 363, + 381, 199, 200, 429, 414, 593, 594, 814, 584, 429, + 584, 343, 369, 335, 864, 256, 373, 367, 428, 1311, + 893, 371, 375, 373, 374, 642, 376, 644, 1207, 418, + 343, 381, 1324, 492, 415, 735, 653, 372, 375, 21, + 367, 1219, 418, 305, 371, 1224, 305, 418, 391, 381, + 1219, 1343, 640, 305, 418, 1156, 272, 645, 646, 391, + 648, 277, 339, 897, 262, 281, 423, 344, 934, 346, + 52, 414, 349, 350, 339, 352, 353, 694, 391, 344, + 296, 346, 414, 418, 349, 350, 1264, 352, 353, 371, + 288, 373, 256, 420, 711, 1264, 428, 374, 339, 272, + 559, 414, 300, 344, 357, 346, 694, 323, 349, 350, + 308, 352, 353, 1152, 1219, 428, 369, 687, 272, 372, + 373, 709, 726, 296, 758, 584, 342, 256, 993, 1219, + 256, 305, 1219, 386, 272, 1219, 724, 752, 264, 339, + 269, 729, 296, 339, 761, 373, 373, 414, 1219, 376, + 323, 958, 429, 351, 256, 1005, 354, 286, 296, 1264, + 775, 428, 390, 391, 429, 369, 357, 367, 421, 323, + 754, 367, 363, 357, 1264, 790, 793, 1264, 369, 376, + 1264, 372, 373, 374, 772, 323, 774, 888, 429, 256, + 388, 389, 809, 1264, 778, 386, 780, 814, 899, 325, + 909, 789, 386, 367, 368, 369, 376, 371, 372, 950, + 374, 368, 376, 381, 269, 1218, 1219, 374, 416, 417, + 371, 809, 841, 391, 381, 367, 814, 418, 816, 357, + 818, 286, 391, 381, 1077, 256, 1239, 339, 436, 1124, + 398, 399, 344, 391, 346, 373, 414, 349, 350, 357, + 352, 353, 450, 868, 418, 414, 420, 871, 386, 423, + 1110, 1264, 721, 1266, 723, 373, 414, 368, 369, 428, + 1113, 1156, 339, 386, 862, 991, 864, 344, 386, 346, + 428, 849, 349, 350, 854, 352, 353, 904, 418, 906, + 306, 371, 308, 881, 306, 912, 1103, 313, 428, 1324, + 888, 313, 339, 1019, 1189, 1014, 1149, 367, 767, 325, + 898, 770, 900, 325, 373, 418, 376, 376, 339, 1395, + 937, 369, 371, 344, 373, 346, 256, 429, 349, 350, + 367, 352, 353, 381, 532, 379, 367, 368, 367, 376, + 367, 958, 384, 392, 393, 376, 368, 376, 963, 376, + 367, 368, 367, 941, 376, 943, 554, 974, 946, 376, + 368, 376, 429, 412, 1274, 256, 374, 385, 376, 368, + 958, 420, 1282, 372, 423, 374, 368, 376, 576, 389, + 372, 1457, 1166, 1226, 376, 370, 400, 955, 368, 374, + 1140, 371, 368, 373, 374, 965, 372, 967, 374, 969, + 376, 373, 990, 368, 376, 993, 370, 390, 429, 339, + 374, 376, 392, 393, 344, 369, 346, 370, 1494, 349, + 350, 374, 352, 353, 418, 372, 374, 1293, 376, 376, + 1516, 1517, 412, 381, 261, 354, 355, 1236, 372, 1023, + 420, 372, 376, 423, 1032, 376, 1034, 1035, 339, 1037, + 372, 371, 374, 344, 376, 346, 415, 284, 349, 350, + 6, 352, 353, 418, 370, 370, 372, 665, 374, 374, + 297, 17, 372, 256, 1047, 302, 376, 370, 305, 372, + 307, 374, 309, 310, 311, 312, 1103, 277, 686, 1077, + 317, 1105, 370, 371, 321, 373, 374, 375, 325, 429, + 386, 387, 388, 1091, 1092, 1089, 333, 369, 418, 336, + 372, 338, 371, 59, 373, 1103, 367, 63, 369, 354, + 355, 1140, 1110, 1142, 1104, 1113, 1140, 394, 395, 396, + 397, 372, 372, 374, 374, 362, 370, 996, 372, 367, + 368, 87, 88, 1131, 374, 376, 376, 1166, 1124, 1137, + 1124, 370, 1166, 372, 752, 376, 370, 1407, 372, 367, + 367, 1149, 108, 371, 373, 373, 374, 370, 376, 372, + 372, 294, 374, 381, 294, 1163, 1164, 775, 1197, 372, + 1156, 374, 1156, 370, 370, 372, 372, 364, 365, 1298, + 343, 418, 790, 374, 376, 376, 794, 368, 369, 1218, + 1219, 374, 1217, 376, 1218, 372, 374, 415, 376, 414, + 415, 157, 1321, 1189, 374, 1189, 376, 372, 373, 1207, + 1239, 364, 365, 1108, 1109, 1239, 1335, 392, 393, 398, + 399, 376, 376, 418, 414, 356, 1224, 369, 1226, 418, + 59, 375, 418, 372, 1353, 1264, 1355, 1266, 372, 376, + 1267, 849, 1266, 199, 200, 368, 374, 372, 1273, 294, + 372, 1120, 294, 374, 372, 1124, 372, 374, 1127, 867, + 868, 372, 376, 371, 93, 1290, 1291, 256, 97, 98, + 99, 100, 101, 102, 103, 104, 374, 294, 294, 381, + 372, 374, 1151, 373, 1278, 373, 375, 1156, 1313, 61, + 374, 1316, 418, 65, 66, 67, 381, 69, 70, 372, + 374, 372, 74, 75, 374, 374, 262, 374, 423, 81, + 429, 83, 374, 85, 367, 421, 372, 372, 90, 91, + 1189, 1345, 373, 343, 374, 294, 934, 294, 374, 370, + 286, 418, 288, 371, 367, 1329, 1205, 418, 375, 256, + 256, 256, 114, 374, 300, 256, 381, 955, 280, 256, + 1374, 1375, 308, 1377, 367, 963, 1385, 368, 372, 343, + 368, 317, 371, 371, 1388, 373, 374, 1391, 351, 370, + 376, 374, 374, 1402, 372, 370, 376, 381, 372, 372, + 423, 347, 1406, 339, 392, 393, 1415, 1416, 367, 381, + 381, 256, 256, 347, 372, 351, 372, 1395, 354, 1393, + 368, 376, 374, 339, 412, 370, 1430, 370, 370, 1407, + 348, 375, 420, 1442, 1443, 423, 368, 372, 348, 418, + 368, 374, 418, 372, 367, 376, 1424, 367, 261, 368, + 367, 381, 388, 389, 356, 376, 371, 368, 337, 93, + 374, 368, 368, 97, 98, 99, 100, 101, 102, 103, + 104, 284, 372, 305, 367, 369, 374, 286, 418, 1457, + 416, 417, 371, 371, 297, 371, 376, 296, 371, 302, + 1499, 418, 305, 302, 307, 373, 309, 310, 311, 312, + 381, 371, 254, 367, 317, 257, 371, 381, 321, 1516, + 1517, 369, 325, 418, 418, 418, 1494, 371, 373, 372, + 333, 372, 374, 336, 373, 338, 1500, 1501, 374, 256, + 372, 374, 372, 1507, 1508, 376, 418, 370, 1516, 1517, + 376, 418, 418, 372, 381, 376, 298, 418, 376, 362, + 372, 367, 372, 368, 381, 1143, 492, 368, 370, 256, + 315, 313, 372, 263, 373, 371, 261, 371, 368, 372, + 372, 0, 0, 367, 372, 376, 385, 386, 387, 368, + 0, 390, 391, 368, 372, 372, 370, 367, 418, 284, + 368, 368, 0, 372, 370, 367, 532, 418, 368, 418, + 373, 376, 297, 372, 368, 418, 372, 302, 376, 376, + 372, 1199, 307, 376, 309, 310, 311, 312, 554, 368, + 367, 372, 317, 559, 368, 368, 321, 372, 376, 1217, + 367, 315, 263, 50, 376, 376, 376, 376, 333, 12, + 576, 336, 339, 338, 376, 376, 376, 344, 584, 346, + 347, 348, 349, 350, 351, 352, 353, 354, 355, 356, + 376, 5, 955, 849, 1266, 1447, 1103, 362, 302, 364, + 365, 368, 1103, 370, 1239, 372, 1410, 374, 375, 376, + 686, 1427, 1398, 1463, 1393, 1273, 1274, 1299, 700, 871, + 871, 1311, 871, 390, 1282, 0, 1508, 1264, 332, 1252, + 1330, 866, 1290, 1291, 401, 1293, 1502, 1420, 256, 1416, + 1415, 1299, 1501, 1197, 1355, 1299, 413, 1199, 841, 381, + 729, 814, 809, 1311, 532, 1313, 594, 369, 1316, 665, + 1005, 893, 429, 694, 71, 487, 1324, 335, 401, 373, + 402, 403, 404, 405, 406, 407, 408, 409, 410, 411, + 686, 385, 386, 387, 400, 1343, 390, 391, 392, 393, + 394, 395, 396, 397, 398, 399, 400, 401, 402, 403, + 404, 405, 581, 726, 402, 404, 528, 403, 405, 1178, + 794, 157, 1124, 554, 1273, 721, 1189, 723, 1068, 992, + 1092, 339, 1019, 1080, 1082, 1152, 344, 530, 346, 347, + 348, 349, 350, 351, 352, 353, 354, 355, 356, 425, + 914, 425, 976, 651, 1269, 847, 752, 1164, 846, -1, + 368, -1, 370, -1, 372, -1, 374, 375, 376, -1, + -1, 767, -1, -1, 770, -1, -1, -1, -1, 775, + -1, -1, 390, -1, -1, -1, -1, -1, 256, 257, + -1, -1, -1, 261, 790, -1, -1, 265, 794, 267, + -1, -1, 270, -1, 272, 273, 0, 275, -1, 277, + -1, 279, -1, 281, 282, 283, 284, -1, 512, 287, + 288, 429, -1, -1, -1, 293, -1, 295, 296, 297, + -1, -1, 300, 301, 302, -1, 304, -1, -1, 307, + -1, 309, 310, 311, 312, -1, -1, -1, 316, 317, + 318, -1, -1, 321, 322, 323, -1, 726, -1, -1, + -1, -1, 330, 331, -1, 333, 334, -1, 336, 337, + 338, 867, 868, -1, 342, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 581, -1, -1, + -1, 256, -1, -1, 362, 0, 261, 262, -1, -1, + 368, 369, -1, -1, -1, -1, -1, -1, -1, 377, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 284, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 297, 298, -1, -1, -1, 302, 934, -1, + 305, -1, 307, -1, 309, 310, 311, 312, -1, -1, + 418, -1, 317, -1, -1, -1, 321, -1, -1, -1, + 325, -1, -1, -1, -1, -1, -1, 963, 333, -1, + -1, 336, -1, 338, 339, -1, -1, -1, -1, 344, + -1, 346, 347, 348, 349, 350, 351, 352, 353, 354, + 355, 356, -1, -1, -1, -1, -1, 362, 363, -1, + 996, -1, 367, 368, -1, 370, 371, 372, 373, 374, + 375, 376, -1, 378, 379, -1, 381, 382, 383, 384, + 385, 386, 387, 388, 389, 390, -1, 392, 393, 394, 395, 396, 397, 398, 399, 400, 401, 402, 403, 404, - 405, 406, 407, 408, 409, 410, 411, 412, 413, 549, - 157, 416, 1057, 418, 1114, 420, 1081, 1008, 423, 1069, - 1071, 0, 965, 981, 429, 525, 1143, 256, 257, -1, - 903, 421, 261, 1154, 837, 1259, 265, -1, 267, -1, - -1, 270, -1, 272, 273, -1, 275, 836, 277, -1, - 279, -1, 281, 282, 283, 284, -1, 285, 287, 288, - -1, -1, -1, -1, 293, -1, 295, 296, 297, -1, - -1, 300, 301, 302, -1, 304, -1, -1, 307, -1, - 309, 310, 311, 312, -1, -1, -1, 316, 317, 318, - -1, -1, 321, 322, 323, -1, -1, -1, -1, 327, - -1, 330, 331, -1, 333, 334, -1, 336, 337, 338, - -1, 1110, -1, 342, -1, 1114, -1, -1, 1117, -1, + 405, 406, 407, 408, 409, 410, 411, 412, 413, -1, + -1, 416, -1, 418, -1, 420, -1, 0, 423, -1, + -1, -1, -1, 257, 429, -1, -1, 261, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 272, -1, + -1, -1, -1, 277, -1, -1, -1, 281, -1, -1, + 284, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 296, 297, -1, -1, -1, 301, 302, -1, + -1, -1, -1, 307, -1, 309, 310, 311, 312, -1, + -1, -1, -1, 317, 1120, -1, -1, 321, 1124, 323, + -1, 1127, -1, -1, -1, -1, -1, -1, -1, 333, + -1, 335, 336, -1, 338, -1, -1, 1143, 342, -1, + -1, -1, 257, 256, -1, 1151, 261, -1, -1, -1, + 1156, -1, -1, -1, -1, -1, -1, 272, 362, -1, + -1, -1, 277, -1, 368, 369, 281, -1, -1, 284, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, 362, -1, 1134, -1, -1, -1, 368, - 369, -1, -1, 1142, -1, -1, -1, 1146, 377, 377, - 378, 379, 380, -1, 382, 383, 384, 385, 386, 387, - 388, 389, -1, -1, 392, 393, 394, 395, 396, 397, - 398, 399, -1, -1, -1, -1, -1, -1, 257, -1, - 1179, -1, 261, -1, -1, -1, -1, -1, 0, 418, - 1189, -1, -1, 272, -1, -1, 1195, -1, 277, -1, - -1, -1, 281, -1, -1, 284, -1, -1, 1207, -1, - -1, -1, -1, -1, -1, -1, 882, 296, 297, -1, - -1, -1, 301, 302, -1, -1, -1, -1, 307, -1, - 309, 310, 311, 312, -1, -1, -1, -1, 317, -1, - -1, -1, 321, -1, 323, -1, -1, -1, -1, -1, - -1, -1, -1, -1, 333, -1, 335, 336, -1, 338, - -1, -1, -1, 342, 1263, 1264, -1, -1, -1, -1, - -1, -1, -1, 1272, -1, -1, -1, 256, 257, -1, - -1, 1280, 1281, 362, 1283, 264, 265, 266, 267, 268, - 369, 270, 271, -1, 273, 274, 275, 276, 277, 278, - 279, 280, -1, -1, 1303, -1, 285, 1306, 287, 288, - 289, 290, 291, 292, 0, -1, 295, -1, -1, -1, - 299, 300, -1, 302, 303, 304, -1, -1, -1, -1, - -1, -1, -1, -1, -1, 314, -1, 316, -1, 318, - 319, -1, -1, 322, -1, 324, 325, 326, 327, 328, - 329, 330, 331, 332, 333, 334, 335, -1, 337, -1, - -1, 340, 341, -1, -1, 344, 345, -1, -1, -1, + -1, 296, 297, 1189, -1, -1, 301, 302, -1, 893, + -1, -1, 307, 1199, 309, 310, 311, 312, -1, 1205, + -1, -1, 317, -1, -1, -1, 321, -1, 323, -1, + -1, 1217, -1, -1, 0, -1, -1, -1, 333, -1, + 335, 336, -1, 338, -1, -1, 339, 342, -1, -1, + -1, 344, -1, 346, 347, 348, 349, 350, 351, 352, + 353, 354, 355, 356, -1, -1, -1, 362, -1, -1, + -1, -1, -1, -1, 369, 368, -1, 370, -1, 372, + -1, 374, 375, 376, -1, -1, -1, 1273, 1274, -1, + -1, -1, -1, -1, -1, -1, 1282, 390, -1, -1, + -1, -1, -1, -1, 1290, 1291, -1, 1293, 401, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - 359, 360, 361, 362, 363, -1, -1, -1, 367, 368, - -1, -1, 371, -1, -1, -1, -1, 376, 377, 378, - 379, 380, -1, -1, -1, 384, -1, 386, -1, -1, - -1, -1, -1, 392, 393, -1, -1, -1, -1, -1, + 413, -1, -1, 256, 257, -1, -1, 1313, -1, -1, + 1316, 264, 265, 266, 267, 268, 429, 270, 271, -1, + 273, 274, 275, 276, 277, 278, 279, 280, -1, -1, + -1, -1, 285, -1, 287, 288, 289, 290, 291, 292, + 0, -1, 295, -1, -1, -1, 299, 300, -1, 302, + 303, 304, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 314, -1, 316, -1, 318, 319, -1, -1, 322, + -1, 324, 325, 326, 327, 328, 329, 330, 331, 332, + 333, 334, 335, -1, 337, -1, -1, 340, 341, -1, + -1, 344, 345, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 359, 360, 361, 362, + 363, -1, -1, -1, 367, 368, -1, -1, 371, -1, + -1, -1, -1, 376, 377, 378, 379, 380, -1, -1, + -1, 384, -1, 386, -1, -1, -1, -1, -1, 392, + 393, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, 417, 418, - 419, 420, -1, 422, 256, 257, -1, -1, -1, -1, - 429, -1, 264, 265, 266, 267, 268, -1, 270, 271, - 0, 273, 274, 275, 276, 277, 278, 279, -1, -1, - -1, -1, -1, 285, -1, 287, 288, 289, 290, 291, - 292, -1, -1, 295, -1, -1, -1, 299, 300, -1, - 302, 303, 304, -1, -1, -1, -1, -1, -1, -1, - -1, -1, 314, -1, 316, -1, 318, 319, -1, -1, - 322, -1, 324, 325, 326, 327, 328, 329, 330, 331, - 332, 333, 334, 335, -1, 337, -1, -1, 340, 341, - -1, -1, 344, 345, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, 359, 360, 361, - 362, 363, -1, -1, -1, 367, 368, -1, -1, 371, - -1, -1, -1, -1, 376, 377, 378, 379, 380, -1, - 256, -1, 384, -1, 386, 261, 262, -1, -1, -1, - 392, 393, -1, -1, -1, -1, -1, -1, -1, -1, - 0, -1, -1, -1, -1, -1, -1, -1, 284, -1, - -1, -1, -1, -1, -1, 417, 418, 419, 420, -1, - 422, 297, 298, -1, -1, -1, 302, 429, -1, 305, - -1, 307, -1, 309, 310, 311, 312, -1, -1, -1, - -1, 317, -1, -1, -1, 321, -1, -1, -1, 325, - -1, -1, -1, -1, -1, -1, -1, 333, -1, -1, - 336, -1, 338, 339, -1, -1, -1, -1, 344, -1, - 346, 347, 348, 349, 350, 351, 352, 353, 354, 355, - 356, 357, -1, -1, -1, -1, 362, 363, -1, -1, - -1, 367, 368, 369, 370, 371, 372, 373, 374, 375, - 376, -1, 378, 379, -1, -1, 382, 383, 384, 385, - 386, -1, -1, 389, 390, -1, -1, -1, 394, 395, - 396, 397, 398, 399, 400, 401, 256, -1, -1, -1, - 0, 261, 262, -1, -1, -1, -1, 413, -1, -1, - 416, -1, 418, -1, 420, -1, -1, 423, -1, -1, - -1, -1, -1, 429, 284, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, 297, 298, -1, - -1, -1, 302, -1, -1, 305, -1, 307, -1, 309, + -1, -1, -1, -1, 417, 418, 419, 420, -1, 422, + 256, 257, -1, -1, -1, -1, 429, -1, 264, 265, + 266, 267, 268, -1, 270, 271, 0, 273, 274, 275, + 276, 277, 278, 279, -1, -1, -1, -1, -1, 285, + -1, 287, 288, 289, 290, 291, 292, -1, -1, 295, + -1, -1, -1, 299, 300, -1, 302, 303, 304, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 314, -1, + 316, -1, 318, 319, -1, -1, 322, -1, 324, 325, + 326, 327, 328, 329, 330, 331, 332, 333, 334, 335, + -1, 337, -1, -1, 340, 341, -1, -1, 344, 345, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 359, 360, 361, 362, 363, -1, -1, + -1, 367, 368, -1, -1, 371, -1, -1, -1, -1, + 376, 377, 378, 379, 380, -1, 256, -1, 384, -1, + 386, 261, 262, -1, -1, -1, 392, 393, -1, -1, + -1, -1, -1, -1, -1, -1, 0, -1, -1, -1, + -1, -1, -1, -1, 284, -1, -1, -1, -1, -1, + -1, 417, 418, 419, 420, -1, 422, 297, 298, -1, + -1, -1, 302, 429, -1, 305, -1, 307, -1, 309, 310, 311, 312, -1, -1, -1, -1, 317, -1, -1, -1, 321, -1, -1, -1, 325, -1, -1, -1, -1, -1, -1, -1, 333, -1, -1, 336, -1, 338, 339, -1, -1, -1, -1, 344, -1, 346, 347, 348, 349, - 350, 351, 352, 353, 354, 355, 356, -1, -1, -1, - -1, -1, 362, 363, 0, -1, -1, 367, 368, 369, - 370, 371, 372, -1, 374, 375, 376, -1, 378, 379, - -1, -1, 382, 383, 384, 385, 256, -1, -1, 389, - 390, 261, 262, -1, 394, 395, 396, 397, 398, 399, - 400, 401, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, 413, 284, -1, 416, -1, 418, -1, - 420, -1, -1, 423, -1, -1, -1, 297, 298, 429, - -1, -1, 302, -1, -1, 305, -1, 307, -1, 309, - 310, 311, 312, -1, -1, -1, -1, 317, -1, -1, - -1, 321, -1, -1, -1, 325, -1, -1, -1, -1, - -1, -1, -1, 333, -1, -1, 336, -1, 338, 339, - -1, -1, -1, -1, 344, -1, 346, 347, 348, 349, - 350, 351, 352, 353, 354, 355, 356, -1, -1, -1, - -1, -1, 362, 363, 0, -1, -1, 367, 368, 369, - 370, 371, 372, -1, 374, 375, 376, -1, 378, 379, - -1, -1, 382, 383, 384, 385, 256, -1, -1, 389, - 390, 261, 262, -1, 394, 395, 396, 397, 398, 399, - 400, 401, -1, -1, -1, -1, -1, 0, -1, -1, - -1, -1, -1, 413, 284, -1, 416, -1, 418, -1, - 420, -1, -1, 423, -1, -1, -1, 297, 298, 429, - -1, -1, 302, -1, -1, 305, -1, 307, -1, 309, - 310, 311, 312, -1, -1, -1, -1, 317, -1, -1, - 0, 321, -1, -1, -1, 325, -1, -1, -1, -1, - -1, -1, -1, 333, -1, -1, 336, -1, 338, 339, - -1, -1, -1, -1, 344, -1, 346, 347, 348, 349, - 350, 351, 352, 353, 354, 355, 356, -1, -1, -1, - 256, -1, 362, 363, -1, -1, 262, 367, 368, -1, - 370, 371, 372, -1, 374, 375, 376, -1, 378, 379, - -1, -1, 382, 383, 384, 385, -1, -1, -1, 389, + 350, 351, 352, 353, 354, 355, 356, 357, -1, -1, + -1, -1, 362, 363, -1, -1, -1, 367, 368, 369, + 370, 371, 372, 373, 374, 375, 376, -1, 378, 379, + -1, -1, 382, 383, 384, 385, 386, -1, -1, 389, 390, -1, -1, -1, 394, 395, 396, 397, 398, 399, - 400, 401, 298, 0, -1, -1, -1, -1, -1, -1, + 400, 401, 256, -1, -1, -1, 0, 261, 262, -1, -1, -1, -1, 413, -1, -1, 416, -1, 418, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, 429, + 420, -1, -1, 423, -1, -1, -1, -1, -1, 429, + 284, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 297, 298, -1, -1, -1, 302, -1, + -1, 305, -1, 307, -1, 309, 310, 311, 312, -1, + -1, -1, -1, 317, -1, -1, -1, 321, -1, -1, + -1, 325, -1, -1, -1, -1, -1, -1, -1, 333, + -1, -1, 336, -1, 338, 339, -1, -1, -1, -1, + 344, -1, 346, 347, 348, 349, 350, 351, 352, 353, + 354, 355, 356, -1, -1, -1, -1, -1, 362, 363, + 0, -1, -1, 367, 368, 369, 370, 371, 372, -1, + 374, 375, 376, -1, 378, 379, -1, -1, 382, 383, + 384, 385, 256, -1, -1, 389, 390, 261, 262, -1, + 394, 395, 396, 397, 398, 399, 400, 401, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 413, + 284, -1, 416, -1, 418, -1, 420, -1, -1, 423, + -1, -1, -1, 297, 298, 429, -1, -1, 302, -1, + -1, 305, -1, 307, -1, 309, 310, 311, 312, -1, + -1, -1, -1, 317, -1, -1, -1, 321, -1, -1, + -1, 325, -1, -1, -1, -1, -1, -1, -1, 333, + -1, -1, 336, -1, 338, 339, -1, -1, -1, -1, + 344, -1, 346, 347, 348, 349, 350, 351, 352, 353, + 354, 355, 356, -1, -1, -1, -1, -1, 362, 363, + -1, -1, -1, 367, 368, 369, 370, 371, 372, -1, + 374, 375, 376, -1, 378, 379, 0, -1, 382, 383, + 384, 385, 256, -1, -1, 389, 390, 261, 262, -1, + 394, 395, 396, 397, 398, 399, 400, 401, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 413, + 284, -1, 416, -1, 418, -1, 420, -1, -1, 423, + -1, -1, -1, 297, 298, 429, -1, -1, 302, -1, + -1, 305, -1, 307, -1, 309, 310, 311, 312, -1, + -1, -1, -1, 317, -1, -1, -1, 321, -1, -1, + -1, 325, -1, -1, -1, -1, -1, -1, -1, 333, + -1, -1, 336, -1, 338, 339, -1, -1, -1, -1, + 344, -1, 346, 347, 348, 349, 350, 351, 352, 353, + 354, 355, 356, -1, -1, -1, 256, -1, 362, 363, + -1, -1, 262, 367, 368, -1, 370, 371, 372, -1, + 374, 375, 376, -1, 378, 379, 0, -1, 382, 383, + 384, 385, -1, -1, -1, 389, 390, -1, -1, -1, + 394, 395, 396, 397, 398, 399, 400, 401, 298, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 413, + -1, -1, 416, -1, 418, -1, -1, -1, -1, 0, + -1, -1, -1, -1, -1, 429, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 339, + -1, -1, 256, -1, 344, -1, 346, 347, 348, 349, + 350, 351, 352, 353, 354, 355, 356, 357, -1, -1, + -1, -1, 0, 363, -1, -1, -1, 367, 368, 369, + 370, 371, 372, 373, 374, 375, 376, -1, 378, 379, + -1, -1, 382, 383, 384, 385, 386, -1, -1, 389, + 390, -1, -1, -1, 394, 395, 396, 397, 398, 399, + 400, 401, 256, -1, -1, 0, -1, -1, 262, -1, + -1, -1, -1, 413, -1, -1, 416, -1, 418, -1, + 420, -1, -1, 423, -1, 339, -1, -1, -1, 429, + 344, -1, 346, 347, 348, 349, 350, 351, 352, 353, + 354, 355, 356, -1, 298, -1, -1, -1, 0, -1, + -1, -1, -1, -1, 368, -1, 370, -1, 372, -1, + 374, 375, 376, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, 339, -1, -1, 0, -1, 344, -1, - 346, 347, 348, 349, 350, 351, 352, 353, 354, 355, - 356, -1, -1, -1, -1, -1, -1, 363, -1, -1, - -1, 367, 368, -1, 370, 371, 372, -1, 374, 375, - 376, -1, 378, 379, -1, -1, 382, 383, 384, 385, - -1, 257, -1, 389, 390, 261, -1, -1, 394, 395, - 396, 397, 398, 399, 400, 401, 272, -1, -1, 0, - -1, 277, -1, -1, -1, 281, -1, 413, 284, -1, - 416, -1, 418, -1, -1, -1, -1, -1, -1, -1, - 296, 297, -1, 429, 257, 301, 302, -1, 261, -1, - -1, 307, -1, 309, 310, 311, 312, -1, -1, 272, - -1, 317, 0, -1, 277, 321, -1, 323, 281, -1, - -1, 284, -1, -1, -1, -1, -1, 333, -1, 335, - 336, -1, 338, 296, 297, -1, 342, 257, 301, 302, - -1, 261, -1, -1, 307, -1, 309, 310, 311, 312, - -1, -1, 272, -1, 317, 0, 362, 277, 321, -1, - 323, 281, 368, 369, 284, -1, -1, -1, -1, -1, - 333, -1, -1, 336, -1, 338, 296, 297, -1, 342, - -1, 301, 302, -1, -1, -1, -1, 307, -1, 309, - 310, 311, 312, -1, -1, -1, -1, 317, 0, 362, - -1, 321, -1, 323, -1, 368, 369, -1, -1, -1, - -1, -1, -1, 333, -1, -1, 336, -1, 338, -1, - 257, -1, 342, -1, 261, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, 272, -1, -1, -1, -1, - 277, -1, 362, -1, 281, -1, -1, 284, 368, 369, - -1, -1, -1, -1, -1, -1, -1, -1, -1, 296, - 297, -1, -1, 257, 301, 302, -1, 261, -1, -1, - 307, -1, 309, 310, 311, 312, -1, -1, 272, -1, - 317, -1, -1, 277, 321, -1, 323, 281, -1, -1, - 284, -1, -1, -1, -1, -1, 333, -1, -1, 336, - -1, 338, 296, 297, -1, 342, -1, 301, 302, -1, - -1, -1, -1, 307, -1, 309, 310, 311, 312, -1, - -1, -1, -1, 317, -1, 362, 257, 321, -1, 323, - 261, -1, 369, -1, -1, -1, -1, -1, -1, 333, - -1, 272, 336, -1, 338, -1, 277, -1, 342, -1, - 281, -1, -1, 284, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, 296, 297, -1, 362, 257, + -1, -1, -1, -1, -1, 339, -1, -1, -1, -1, + 344, 0, 346, 347, 348, 349, 350, 351, 352, 353, + 354, 355, 356, -1, -1, -1, -1, -1, -1, 363, + -1, -1, -1, 367, 368, 429, 370, 371, 372, -1, + 374, 375, 376, -1, 378, 379, -1, -1, 382, 383, + 384, 385, -1, 257, 0, 389, 390, 261, -1, -1, + 394, 395, 396, 397, 398, 399, 400, 401, 272, -1, + -1, -1, -1, 277, -1, -1, -1, 281, -1, 413, + 284, -1, 416, -1, 418, -1, -1, -1, -1, -1, + -1, -1, 296, 297, -1, 429, 257, 301, 302, -1, + 261, -1, -1, 307, -1, 309, 310, 311, 312, -1, + -1, 272, -1, 317, -1, -1, 277, 321, -1, 323, + 281, 0, -1, 284, -1, -1, -1, -1, -1, 333, + -1, -1, 336, -1, 338, 296, 297, -1, 342, 257, 301, 302, -1, 261, -1, -1, 307, -1, 309, 310, - 311, 312, -1, -1, 272, -1, 317, -1, -1, 277, - 321, -1, 323, 281, -1, -1, 284, -1, -1, -1, + 311, 312, -1, -1, 272, -1, 317, -1, 362, 277, + 321, -1, 323, 281, 368, 369, 284, -1, 0, -1, -1, -1, 333, -1, -1, 336, -1, 338, 296, 297, -1, 342, 257, 301, 302, -1, 261, -1, -1, 307, -1, 309, 310, 311, 312, -1, -1, 272, -1, 317, - -1, 362, 277, 321, -1, 323, 281, -1, -1, 284, + -1, 362, 277, 321, -1, 323, 281, 368, 369, 284, -1, -1, -1, -1, -1, 333, -1, -1, 336, -1, 338, 296, 297, -1, 342, 257, 301, 302, -1, 261, -1, -1, 307, -1, 309, 310, 311, 312, -1, -1, 272, -1, 317, -1, 362, 277, 321, -1, 323, 281, - -1, -1, 284, -1, -1, -1, -1, -1, 333, -1, - -1, 336, -1, 338, 296, 297, -1, 342, -1, 301, + -1, 369, 284, -1, -1, -1, -1, -1, 333, -1, + -1, 336, -1, 338, 296, 297, -1, 342, 257, 301, + 302, -1, 261, -1, -1, 307, -1, 309, 310, 311, + 312, -1, -1, 272, -1, 317, -1, 362, 277, 321, + -1, 323, 281, -1, -1, 284, -1, -1, -1, -1, + -1, 333, -1, -1, 336, -1, 338, 296, 297, -1, + 342, 257, 301, 302, -1, 261, -1, -1, 307, -1, + 309, 310, 311, 312, -1, -1, 272, -1, 317, -1, + 362, 277, 321, -1, 323, 281, -1, -1, 284, -1, + -1, -1, -1, -1, 333, -1, -1, 336, -1, 338, + 296, 297, -1, 342, -1, 301, 302, -1, -1, -1, + -1, 307, -1, 309, 310, 311, 312, -1, -1, -1, + -1, 317, -1, 362, -1, 321, -1, 323, 257, -1, + -1, -1, 261, -1, -1, -1, -1, 333, -1, -1, + 336, -1, 338, 272, -1, -1, 342, -1, 277, -1, + -1, -1, 281, -1, -1, 284, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 362, 296, 297, -1, + -1, -1, 301, 302, -1, 257, -1, -1, 307, 261, + 309, 310, 311, 312, -1, -1, -1, -1, 317, -1, + 272, -1, 321, -1, 323, 277, -1, -1, -1, 281, + -1, -1, 284, -1, 333, -1, -1, 336, -1, 338, + -1, -1, -1, 342, 296, 297, -1, -1, -1, 301, 302, -1, -1, -1, -1, 307, -1, 309, 310, 311, - 312, -1, -1, -1, -1, 317, -1, 362, -1, 321, + 312, -1, -1, 362, -1, 317, -1, -1, -1, 321, -1, 323, -1, -1, -1, -1, -1, -1, -1, -1, -1, 333, -1, 256, 336, -1, 338, -1, -1, -1, 342, 264, 265, 266, 267, -1, -1, 270, 271, -1, @@ -11601,21 +11776,21 @@ void case_972() 400, 401, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 412, 413, -1, -1, -1, -1, -1, -1, 420, -1, -1, 423, -1, -1, -1, -1, -1, 429, - -1, -1, 339, -1, -1, -1, -1, 344, -1, 346, + -1, 285, 339, -1, -1, -1, -1, 344, -1, 346, 347, 348, 349, 350, 351, 352, 353, 354, 355, 356, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 367, 368, 369, 370, 371, 372, 373, 374, 375, 376, - 256, 378, 379, -1, 381, 382, 383, 384, 385, 386, + 256, 378, 379, 327, 381, 382, 383, 384, 385, 386, 387, 388, 389, 390, -1, 392, 393, 394, 395, 396, 397, 398, 399, 400, 401, 402, 403, 404, 405, 406, 407, 408, 409, 410, 411, 412, 413, -1, 256, -1, -1, -1, -1, 420, 262, -1, -1, -1, -1, -1, - -1, -1, 429, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 429, 377, 378, 379, 380, -1, 382, 383, + 384, 385, 386, 387, 388, 389, -1, -1, 392, 393, + 394, 395, 396, 397, 398, 399, -1, -1, -1, -1, 298, -1, -1, 339, -1, -1, -1, -1, 344, -1, 346, 347, 348, 349, 350, 351, 352, 353, 354, 355, - 356, -1, -1, -1, -1, -1, -1, -1, -1, 256, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 256, -1, -1, 368, -1, 370, 262, 372, -1, 374, 375, 376, 339, -1, -1, -1, -1, 344, -1, 346, 347, 348, 349, 350, 351, 352, 353, 354, 355, 356, -1, @@ -11679,7 +11854,7 @@ void case_972() -1, -1, 297, -1, -1, -1, 298, 302, -1, -1, -1, -1, 307, -1, 309, 310, 311, 312, -1, -1, -1, -1, 317, -1, -1, -1, 321, -1, -1, 256, - -1, -1, -1, -1, -1, 262, -1, -1, 333, 266, + 325, -1, -1, -1, -1, 262, -1, -1, 333, 266, -1, 336, -1, 338, -1, -1, -1, 339, -1, -1, -1, -1, 344, -1, 346, 347, 348, 349, 350, 351, 352, 353, 354, 355, 356, -1, -1, 362, -1, -1, @@ -11688,46 +11863,46 @@ void case_972() 382, 383, 384, 385, 386, 387, 388, 389, 390, -1, 392, 393, 394, 395, 396, 397, 398, 399, 400, 401, 402, 403, 404, 405, 406, 407, 408, 409, 410, 411, - 412, 413, 256, 418, -1, -1, -1, -1, 420, -1, + 412, 413, -1, 418, -1, -1, -1, -1, 420, -1, 357, 423, -1, -1, -1, -1, 363, 429, -1, -1, -1, 368, 369, 370, 371, 372, 373, 374, 375, 376, -1, 378, 379, -1, 381, 382, 383, 384, 385, 386, 387, 388, 389, 390, -1, 392, 393, 394, 395, 396, 397, 398, 399, 400, 401, 402, 403, 404, 405, 406, 407, 408, 409, 410, 411, 412, 413, -1, 256, -1, - -1, 418, -1, 420, 262, -1, 423, -1, -1, -1, - -1, -1, 429, -1, -1, 339, -1, -1, -1, -1, - 344, -1, 346, 347, 348, 349, 350, 351, 352, 353, - 354, 355, 356, -1, -1, -1, -1, -1, -1, -1, - 298, -1, -1, -1, 368, -1, 370, -1, 372, -1, - 374, 375, 376, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, 390, -1, -1, -1, + 256, 418, -1, 420, 262, -1, 423, -1, 264, 265, + -1, 267, 429, -1, 270, 271, -1, -1, -1, 275, + 276, 277, -1, 279, -1, -1, -1, -1, -1, 285, + -1, -1, 288, -1, -1, -1, -1, -1, -1, 295, + 298, -1, -1, -1, 300, -1, 302, 303, 304, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 316, -1, 318, 319, -1, -1, 322, -1, -1, 325, + -1, 327, -1, 329, 330, 331, 332, -1, 334, -1, -1, 339, -1, -1, -1, -1, 344, -1, 346, 347, 348, 349, 350, 351, 352, 353, 354, 355, 356, -1, - -1, -1, -1, -1, -1, 429, -1, -1, -1, -1, - 368, -1, 370, -1, 372, -1, 374, 375, 376, -1, + -1, -1, -1, 359, 360, 361, 362, -1, -1, -1, + 368, -1, 370, -1, 372, 371, 374, 375, 376, -1, 378, 379, -1, 381, 382, 383, 384, 385, 386, 387, - 388, 389, 390, -1, -1, -1, 394, 395, 396, 397, + 388, 389, 390, 261, -1, -1, 394, 395, 396, 397, 398, 399, 400, 401, 402, 403, 404, 405, 406, 407, - 408, 409, 410, 411, 256, 413, -1, -1, -1, -1, - 262, -1, -1, -1, -1, -1, -1, -1, -1, -1, - 265, 429, 267, -1, -1, 270, -1, -1, -1, -1, - 275, -1, -1, -1, 279, -1, -1, -1, 283, -1, - -1, -1, -1, 288, -1, -1, 298, -1, 293, -1, - 295, -1, -1, -1, -1, 300, -1, -1, -1, 304, - 305, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, 316, 256, 318, -1, -1, -1, 322, 262, -1, - -1, -1, -1, -1, -1, 330, 331, 339, -1, 334, + 408, 409, 410, 411, 256, 413, 284, -1, -1, -1, + 262, 417, 418, -1, -1, -1, -1, -1, -1, 297, + -1, 429, -1, -1, 302, -1, -1, -1, -1, 307, + -1, 309, 310, 311, 312, -1, -1, -1, -1, 317, + -1, -1, -1, 321, -1, -1, 298, -1, -1, -1, + -1, -1, -1, -1, -1, 333, -1, -1, 336, -1, + 338, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 256, -1, -1, -1, -1, -1, 262, -1, + -1, -1, -1, -1, 362, -1, -1, 339, -1, -1, -1, -1, 344, -1, 346, 347, 348, 349, 350, 351, 352, 353, 354, 355, 356, -1, -1, -1, -1, -1, -1, -1, -1, -1, 298, -1, 368, -1, 370, -1, 372, -1, 374, 375, 376, -1, 378, 379, -1, -1, 382, 383, 384, 385, 386, 387, 388, 389, 390, -1, - -1, -1, 394, 395, 396, 397, 398, 399, 400, 401, + 418, -1, 394, 395, 396, 397, 398, 399, 400, 401, -1, -1, -1, -1, -1, 339, -1, -1, -1, -1, 344, 413, 346, 347, 348, 349, 350, 351, 352, 353, - 354, 355, 356, 418, -1, -1, 256, 429, -1, -1, + 354, 355, 356, -1, -1, -1, 256, 429, -1, -1, -1, -1, 262, -1, 368, -1, 370, -1, 372, -1, 374, 375, 376, -1, 378, 379, -1, -1, 382, 383, 384, 385, -1, -1, -1, 389, 390, -1, -1, -1, @@ -11880,37 +12055,87 @@ void case_972() 354, 355, 356, -1, -1, -1, -1, 429, -1, -1, -1, -1, -1, -1, 368, -1, 370, -1, 372, -1, 374, 375, 376, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, 390, -1, 256, -1, + -1, -1, -1, -1, -1, 262, 390, -1, -1, 266, -1, -1, -1, -1, -1, -1, 400, 401, -1, -1, -1, -1, -1, 339, -1, -1, -1, -1, 344, 413, 346, 347, 348, 349, 350, 351, 352, 353, 354, 355, - 356, -1, -1, -1, -1, 429, -1, -1, -1, -1, - -1, -1, 368, -1, 370, -1, 372, -1, 374, 375, - 376, -1, -1, -1, 256, -1, -1, -1, -1, -1, + 356, 298, -1, -1, -1, 429, -1, -1, -1, -1, + -1, -1, 368, -1, 370, -1, 372, 314, 374, 375, + 376, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 390, -1, -1, -1, -1, -1, -1, -1, -1, -1, 400, 401, -1, -1, -1, -1, - -1, 339, -1, -1, -1, -1, 344, 413, 346, 347, - 348, 349, 350, 351, 352, 353, 354, 355, 356, -1, - -1, -1, -1, 429, -1, -1, -1, -1, -1, -1, - 368, -1, 370, -1, 372, -1, 374, 375, 376, -1, - -1, -1, -1, 262, -1, -1, -1, 266, -1, -1, - -1, -1, 390, -1, -1, -1, -1, 339, -1, -1, - -1, -1, 344, 401, 346, 347, 348, 349, 350, 351, - 352, 353, 354, 355, 356, 413, -1, -1, -1, 298, - -1, -1, -1, -1, -1, -1, 368, -1, 370, -1, - 372, 429, 374, 375, 376, 314, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, 390, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, 401, + -1, -1, -1, -1, -1, -1, -1, 413, -1, -1, + 357, -1, -1, -1, -1, -1, 363, -1, -1, -1, + -1, 368, 369, 429, 371, -1, 373, -1, 375, 376, + -1, 378, 379, -1, 381, 382, 383, 384, 385, 386, + 387, 388, 389, 390, -1, 392, 393, 394, 395, 396, + 397, 398, 399, 400, 401, 402, 403, 404, 405, 406, + 407, 408, 409, 410, 411, 412, 413, -1, -1, 256, + -1, 418, -1, 420, -1, -1, 423, 264, 265, 266, + 267, -1, 429, 270, 271, -1, 273, 274, 275, 276, + 277, 278, 279, -1, -1, -1, -1, -1, 285, -1, + 287, 288, 289, 290, 291, 292, -1, -1, 295, -1, + -1, -1, 299, 300, -1, 302, 303, 304, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 314, -1, 316, + -1, 318, 319, -1, -1, 322, -1, 324, 325, 326, + 327, 328, 329, 330, 331, 332, 333, 334, 335, -1, + 337, -1, -1, 340, 341, -1, -1, 344, 345, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, 413, -1, -1, -1, -1, -1, -1, 357, -1, - -1, -1, -1, -1, 363, -1, -1, 429, -1, 368, - 369, -1, 371, -1, 373, -1, 375, 376, -1, 378, - 379, -1, 381, 382, 383, 384, 385, 386, 387, 388, - 389, 390, -1, 392, 393, 394, 395, 396, 397, 398, - 399, 400, 401, 402, 403, 404, 405, 406, 407, 408, - 409, 410, 411, 412, 413, -1, -1, 256, -1, 418, - -1, 420, -1, -1, 423, 264, 265, 266, 267, -1, - 429, 270, 271, -1, 273, 274, 275, 276, 277, 278, + -1, -1, 359, 360, 361, 362, 363, -1, -1, -1, + 367, -1, -1, -1, 371, -1, -1, -1, -1, 376, + 377, 378, 379, 380, -1, -1, -1, 384, -1, 386, + -1, -1, -1, -1, -1, 392, 393, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 256, -1, -1, -1, + 417, 418, 419, 420, 264, 265, 266, 267, -1, -1, + 270, 271, -1, 273, 274, 275, 276, 277, 278, 279, + -1, -1, -1, -1, -1, 285, -1, 287, 288, 289, + 290, 291, 292, -1, -1, 295, -1, -1, -1, 299, + 300, -1, 302, 303, 304, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 314, -1, 316, -1, 318, 319, + -1, -1, 322, -1, 324, 325, 326, 327, 328, 329, + 330, 331, 332, 333, 334, 335, -1, 337, -1, -1, + 340, 341, -1, -1, 344, 345, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 359, + 360, 361, 362, 363, -1, -1, -1, 367, -1, -1, + -1, 371, -1, -1, -1, -1, 376, 377, 378, 379, + 380, -1, -1, -1, 384, -1, 386, -1, -1, -1, + -1, -1, 392, 393, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 256, -1, -1, -1, 417, 418, 419, + 420, 264, 265, 266, 267, -1, -1, 270, 271, -1, + 273, 274, 275, 276, 277, 278, 279, -1, -1, -1, + -1, -1, 285, -1, 287, 288, 289, 290, 291, 292, + -1, -1, 295, -1, -1, -1, 299, 300, -1, 302, + 303, 304, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 314, -1, 316, -1, 318, 319, -1, -1, 322, + -1, 324, 325, 326, 327, 328, 329, 330, 331, 332, + 333, 334, 335, -1, 337, -1, -1, 340, 341, -1, + -1, 344, 345, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 359, 360, 361, 362, + 363, -1, -1, -1, 367, -1, -1, -1, 371, -1, + -1, -1, -1, 376, 377, 378, 379, 380, -1, -1, + -1, 384, -1, 386, -1, -1, -1, -1, -1, 392, + 393, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 256, -1, -1, -1, 417, 418, 419, 420, 264, 265, + 266, 267, -1, -1, 270, 271, -1, 273, 274, 275, + 276, 277, 278, 279, -1, -1, -1, -1, -1, 285, + -1, 287, 288, 289, 290, 291, 292, -1, -1, 295, + -1, -1, -1, 299, 300, -1, 302, 303, 304, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 314, -1, + 316, -1, 318, 319, -1, -1, 322, -1, 324, 325, + 326, 327, 328, 329, 330, 331, 332, 333, 334, 335, + -1, 337, -1, -1, 340, 341, -1, -1, 344, 345, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 359, 360, 361, 362, 363, -1, -1, + -1, 367, -1, -1, -1, 371, -1, -1, -1, -1, + 376, 377, 378, 379, 380, -1, -1, -1, 384, -1, + 386, -1, -1, -1, -1, -1, 392, 393, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 256, -1, -1, + -1, 417, 418, 419, 420, 264, 265, 266, 267, -1, + -1, 270, 271, -1, 273, 274, 275, 276, 277, 278, 279, -1, -1, -1, -1, -1, 285, -1, 287, 288, 289, 290, 291, 292, -1, -1, 295, -1, -1, -1, 299, 300, -1, 302, 303, 304, -1, -1, -1, -1, @@ -11925,71 +12150,130 @@ void case_972() -1, -1, -1, 392, 393, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 256, -1, -1, -1, 417, 418, - 419, 420, 264, 265, 266, 267, -1, -1, 270, 271, - -1, 273, 274, 275, 276, 277, 278, 279, -1, -1, - -1, -1, -1, 285, -1, 287, 288, 289, 290, 291, - 292, -1, -1, 295, -1, -1, -1, 299, 300, -1, - 302, 303, 304, -1, -1, -1, -1, -1, -1, -1, - -1, -1, 314, -1, 316, -1, 318, 319, -1, -1, - 322, -1, 324, 325, 326, 327, 328, 329, 330, 331, - 332, 333, 334, 335, -1, 337, -1, -1, 340, 341, - -1, -1, 344, 345, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, 359, 360, 361, - 362, 363, -1, -1, -1, 367, -1, -1, -1, 371, - -1, -1, -1, -1, 376, 377, 378, 379, 380, -1, + 419, 420, 264, 265, -1, 267, -1, -1, 270, 271, + -1, 256, -1, 275, 276, 277, -1, 279, -1, -1, + 265, -1, 267, 285, -1, 270, 288, -1, -1, -1, + 275, -1, -1, 295, 279, -1, -1, -1, 300, -1, + 302, 303, 304, 288, -1, -1, -1, -1, -1, -1, + 295, -1, -1, -1, 316, 300, 318, 319, -1, 304, + 322, -1, -1, 325, -1, 327, -1, 329, 330, 331, + 332, 316, 334, 318, -1, -1, -1, 322, -1, 341, + -1, -1, 344, 345, -1, 330, 331, -1, -1, 334, + -1, -1, 337, -1, -1, -1, -1, 359, 360, 361, + 362, 363, -1, -1, -1, 367, 368, -1, -1, 371, + -1, -1, -1, -1, -1, 377, 378, 379, 380, -1, -1, -1, 384, -1, 386, -1, -1, -1, -1, -1, 392, 393, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 256, -1, -1, -1, 417, 418, 419, 420, 264, - 265, 266, 267, -1, -1, 270, 271, -1, 273, 274, - 275, 276, 277, 278, 279, -1, -1, -1, -1, -1, - 285, -1, 287, 288, 289, 290, 291, 292, -1, -1, - 295, -1, -1, -1, 299, 300, -1, 302, 303, 304, - -1, -1, -1, -1, -1, -1, -1, -1, -1, 314, - -1, 316, -1, 318, 319, -1, -1, 322, -1, 324, - 325, 326, 327, 328, 329, 330, 331, 332, 333, 334, - 335, -1, 337, -1, -1, 340, 341, -1, -1, 344, - 345, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 265, -1, 267, -1, -1, 270, 271, -1, 256, -1, + 275, 276, 277, 418, 279, -1, -1, 265, -1, 267, + 285, -1, 270, 288, -1, -1, -1, 275, -1, -1, + 295, 279, -1, -1, -1, 300, -1, 302, 303, 304, + 288, 306, -1, -1, -1, -1, -1, 295, 313, -1, + -1, 316, 300, 318, 319, -1, 304, 322, -1, -1, + 325, -1, 327, -1, 329, 330, 331, 332, 316, 334, + 318, -1, -1, -1, 322, -1, 341, -1, -1, 344, + 345, -1, 330, 331, -1, -1, 334, -1, -1, 337, -1, -1, -1, -1, 359, 360, 361, 362, 363, -1, - -1, -1, 367, -1, -1, -1, 371, -1, -1, -1, - -1, 376, 377, 378, 379, 380, -1, -1, -1, 384, + -1, -1, -1, -1, -1, -1, 371, -1, -1, -1, + -1, -1, 377, 378, 379, 380, -1, -1, -1, 384, -1, 386, -1, -1, -1, -1, -1, 392, 393, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 256, -1, - -1, -1, 417, 418, 419, 420, 264, 265, 266, 267, - -1, -1, 270, 271, -1, 273, 274, 275, 276, 277, - 278, 279, -1, -1, -1, -1, -1, 285, -1, 287, - 288, 289, 290, 291, 292, -1, -1, 295, -1, -1, - -1, 299, 300, -1, 302, 303, 304, -1, -1, -1, - -1, -1, -1, -1, -1, -1, 314, -1, 316, -1, - 318, 319, -1, -1, 322, -1, 324, 325, 326, 327, - 328, 329, 330, 331, 332, 333, 334, 335, -1, 337, - -1, -1, 340, 341, -1, -1, 344, 345, -1, -1, + -1, -1, 417, 418, 419, 420, 264, 265, -1, 267, + -1, -1, 270, 271, -1, -1, -1, 275, 276, 277, + 418, 279, -1, -1, 265, -1, 267, 285, -1, 270, + 288, -1, -1, -1, 275, -1, -1, 295, 279, -1, + -1, -1, 300, -1, 302, 303, 304, 288, -1, -1, + -1, -1, -1, -1, 295, -1, -1, -1, 316, 300, + 318, 319, 320, 304, 322, -1, -1, 325, -1, 327, + -1, 329, 330, 331, 332, 316, 334, 318, -1, -1, + -1, 322, -1, 341, -1, -1, 344, 345, -1, 330, + 331, -1, -1, 334, -1, -1, 337, -1, -1, -1, + -1, 359, 360, 361, 362, 363, -1, -1, -1, 367, + -1, -1, -1, 371, -1, -1, -1, -1, -1, 377, + 378, 379, 380, -1, -1, -1, 384, -1, 386, -1, + -1, 372, -1, -1, 392, 393, -1, -1, -1, -1, + -1, -1, 264, 265, -1, 267, -1, -1, 270, 271, + -1, -1, -1, 275, 276, 277, -1, 279, -1, 417, + 418, 419, 420, 285, -1, -1, 288, -1, -1, -1, + -1, -1, -1, 295, -1, -1, -1, 418, 300, -1, + 302, 303, 304, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 316, -1, 318, 319, -1, -1, + 322, -1, -1, 325, -1, 327, -1, 329, 330, 331, + 332, -1, 334, -1, -1, -1, -1, -1, -1, 341, + -1, -1, 344, 345, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 359, 360, 361, + 362, 363, -1, -1, -1, 367, 368, -1, -1, 371, + -1, -1, -1, -1, -1, 377, 378, 379, 380, -1, + -1, -1, 384, -1, 386, -1, -1, -1, -1, -1, + 392, 393, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 256, -1, 417, 418, 419, 420, -1, + -1, 264, 265, -1, 267, -1, 428, 270, 271, -1, + -1, -1, 275, 276, 277, -1, 279, -1, -1, 265, + -1, 267, 285, -1, 270, 288, -1, -1, -1, 275, + -1, -1, 295, 279, -1, -1, -1, 300, -1, 302, + 303, 304, 288, -1, -1, -1, -1, -1, -1, 295, + -1, -1, -1, 316, 300, 318, 319, 320, 304, 322, + -1, -1, 325, -1, 327, -1, 329, 330, 331, 332, + 316, 334, 318, -1, -1, -1, 322, -1, 341, -1, + -1, 344, 345, -1, 330, 331, -1, -1, 334, -1, + -1, 337, -1, -1, -1, -1, 359, 360, 361, 362, + 363, -1, -1, -1, 367, -1, -1, -1, 371, -1, + -1, -1, -1, -1, 377, 378, 379, 380, -1, -1, + -1, 384, -1, 386, 370, -1, -1, -1, -1, 392, + 393, -1, -1, -1, -1, -1, -1, 264, 265, -1, + 267, -1, -1, 270, 271, -1, -1, -1, 275, 276, + 277, -1, 279, -1, 417, 418, 419, 420, 285, -1, + -1, 288, -1, -1, -1, -1, -1, -1, 295, -1, + -1, -1, 418, 300, -1, 302, 303, 304, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 316, + -1, 318, 319, -1, -1, 322, -1, -1, 325, -1, + 327, -1, 329, 330, 331, 332, -1, 334, -1, -1, + -1, -1, -1, -1, 341, -1, -1, 344, 345, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 359, 360, 361, 362, 363, -1, -1, -1, + 367, -1, -1, -1, 371, -1, -1, -1, -1, -1, + 377, 378, 379, 380, -1, -1, -1, 384, -1, 386, + -1, -1, -1, -1, -1, 392, 393, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 256, -1, + 417, 418, 419, 420, -1, -1, 264, 265, -1, 267, + -1, 428, 270, 271, -1, -1, -1, 275, 276, 277, + -1, 279, -1, -1, 265, -1, 267, 285, -1, 270, + 288, -1, -1, -1, 275, -1, -1, 295, 279, -1, + -1, -1, 300, -1, 302, 303, 304, 288, -1, -1, + -1, -1, -1, -1, 295, -1, -1, -1, 316, 300, + 318, 319, -1, 304, 322, -1, -1, 325, -1, 327, + -1, 329, 330, 331, 332, 316, 334, 318, -1, -1, + -1, 322, -1, 341, -1, -1, 344, 345, -1, 330, + 331, -1, -1, 334, -1, -1, 337, -1, -1, -1, -1, 359, 360, 361, 362, 363, -1, -1, -1, 367, - -1, -1, -1, 371, -1, -1, -1, -1, 376, 377, + -1, -1, -1, 371, -1, -1, -1, -1, -1, 377, 378, 379, 380, -1, -1, -1, 384, -1, 386, -1, -1, -1, -1, -1, 392, 393, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 256, -1, -1, -1, 417, - 418, 419, 420, 264, 265, 266, 267, -1, -1, 270, - 271, -1, 273, 274, 275, 276, 277, 278, 279, -1, - -1, -1, -1, -1, 285, -1, 287, 288, 289, 290, - 291, 292, -1, -1, 295, -1, -1, -1, 299, 300, - -1, 302, 303, 304, -1, -1, -1, -1, -1, -1, - -1, -1, -1, 314, -1, 316, -1, 318, 319, -1, - -1, 322, -1, 324, 325, 326, 327, 328, 329, 330, - 331, 332, 333, 334, 335, -1, 337, -1, -1, 340, - 341, -1, -1, 344, 345, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, 359, 360, - 361, 362, 363, -1, -1, -1, 367, -1, -1, -1, - 371, -1, -1, -1, -1, 376, 377, 378, 379, 380, + 418, 419, 420, 264, 265, -1, 267, -1, -1, 270, + 271, -1, -1, -1, 275, 276, 277, 418, 279, -1, + -1, 265, -1, 267, 285, -1, 270, 288, -1, -1, + -1, 275, -1, -1, 295, 279, -1, -1, -1, 300, + -1, 302, 303, 304, 288, -1, -1, -1, -1, -1, + -1, 295, -1, -1, -1, 316, 300, 318, 319, -1, + 304, 322, -1, -1, 325, -1, 327, -1, 329, 330, + 331, 332, 316, 334, 318, -1, -1, -1, 322, -1, + 341, -1, -1, 344, 345, -1, 330, 331, -1, -1, + 334, -1, -1, 337, -1, -1, -1, -1, 359, 360, + 361, 362, 363, -1, -1, -1, -1, -1, -1, -1, + 371, -1, -1, -1, -1, -1, 377, 378, 379, 380, -1, -1, -1, 384, -1, 386, -1, -1, -1, -1, -1, 392, 393, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 256, -1, -1, -1, 417, 418, 419, 420, - 264, 265, -1, 267, -1, -1, 270, 271, -1, 256, - -1, 275, 276, 277, -1, 279, -1, -1, 265, -1, + 264, 265, -1, 267, -1, -1, 270, 271, -1, -1, + -1, 275, 276, 277, 418, 279, -1, -1, 265, -1, 267, 285, -1, 270, 288, -1, -1, -1, 275, -1, -1, 295, 279, -1, -1, -1, 300, -1, 302, 303, 304, 288, -1, -1, -1, -1, -1, -1, 295, -1, @@ -11998,73 +12282,14 @@ void case_972() 334, 318, -1, -1, -1, 322, -1, 341, -1, -1, 344, 345, -1, 330, 331, -1, -1, 334, -1, -1, 337, -1, -1, -1, -1, 359, 360, 361, 362, 363, - -1, -1, -1, 367, 368, -1, -1, 371, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 371, -1, -1, -1, -1, -1, 377, 378, 379, 380, -1, -1, -1, 384, -1, 386, -1, -1, -1, -1, -1, 392, 393, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 256, -1, -1, -1, 417, 418, 419, 420, 264, 265, -1, - 267, -1, -1, 270, 271, -1, 256, -1, 275, 276, + 267, -1, -1, 270, 271, -1, -1, -1, 275, 276, 277, 418, 279, -1, -1, 265, -1, 267, 285, -1, - 270, 288, -1, -1, -1, 275, -1, -1, 295, 279, - -1, -1, -1, 300, -1, 302, 303, 304, 288, -1, - -1, -1, -1, -1, -1, 295, -1, -1, -1, 316, - 300, 318, 319, 320, 304, 322, -1, -1, 325, -1, - 327, -1, 329, 330, 331, 332, 316, 334, 318, -1, - -1, -1, 322, -1, 341, -1, -1, 344, 345, -1, - 330, 331, -1, -1, 334, -1, -1, 337, -1, -1, - -1, -1, 359, 360, 361, 362, 363, -1, -1, -1, - 367, -1, -1, -1, 371, -1, -1, -1, -1, -1, - 377, 378, 379, 380, -1, -1, -1, 384, -1, 386, - -1, -1, -1, -1, -1, 392, 393, -1, -1, -1, - -1, -1, -1, 264, 265, -1, 267, -1, -1, 270, - 271, -1, -1, -1, 275, 276, 277, -1, 279, -1, - 417, 418, 419, 420, 285, -1, -1, 288, -1, -1, - -1, -1, -1, -1, 295, -1, -1, -1, 418, 300, - -1, 302, 303, 304, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, 316, -1, 318, 319, -1, - -1, 322, -1, -1, 325, -1, 327, -1, 329, 330, - 331, 332, -1, 334, -1, -1, -1, -1, -1, -1, - 341, -1, -1, 344, 345, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, 359, 360, - 361, 362, 363, -1, -1, -1, 367, 368, -1, -1, - 371, -1, -1, -1, -1, -1, 377, 378, 379, 380, - -1, -1, -1, 384, -1, 386, -1, -1, -1, -1, - -1, 392, 393, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, 256, -1, 417, 418, 419, 420, - -1, -1, 264, 265, -1, 267, -1, 428, 270, 271, - -1, -1, -1, 275, 276, 277, -1, 279, -1, -1, - 265, -1, 267, 285, -1, 270, 288, -1, -1, -1, - 275, -1, -1, 295, 279, -1, -1, -1, 300, -1, - 302, 303, 304, 288, -1, -1, -1, -1, -1, -1, - 295, -1, -1, -1, 316, 300, 318, 319, 320, 304, - 322, -1, -1, 325, -1, 327, -1, 329, 330, 331, - 332, 316, 334, 318, -1, -1, -1, 322, -1, 341, - -1, -1, 344, 345, -1, 330, 331, -1, -1, 334, - -1, -1, 337, -1, -1, -1, -1, 359, 360, 361, - 362, 363, -1, -1, -1, 367, -1, -1, -1, 371, - -1, -1, -1, -1, -1, 377, 378, 379, 380, -1, - -1, -1, 384, -1, 386, -1, -1, 372, -1, -1, - 392, 393, -1, -1, -1, -1, -1, -1, 264, 265, - -1, 267, -1, -1, 270, 271, -1, -1, -1, 275, - 276, 277, -1, 279, -1, 417, 418, 419, 420, 285, - -1, -1, 288, -1, -1, -1, -1, -1, -1, 295, - -1, -1, -1, 418, 300, -1, 302, 303, 304, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - 316, -1, 318, 319, -1, -1, 322, -1, -1, 325, - -1, 327, -1, 329, 330, 331, 332, -1, 334, -1, - -1, -1, -1, -1, -1, 341, -1, -1, 344, 345, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, 359, 360, 361, 362, 363, -1, -1, - -1, 367, -1, -1, -1, 371, -1, -1, -1, -1, - -1, 377, 378, 379, 380, -1, -1, -1, 384, -1, - 386, -1, -1, -1, -1, -1, 392, 393, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, 256, - -1, 417, 418, 419, 420, -1, -1, 264, 265, -1, - 267, -1, 428, 270, 271, -1, -1, -1, 275, 276, - 277, -1, 279, -1, -1, 265, -1, 267, 285, -1, 270, 288, -1, -1, -1, 275, -1, -1, 295, 279, -1, -1, -1, 300, -1, 302, 303, 304, 288, -1, -1, -1, -1, -1, -1, 295, -1, -1, -1, 316, @@ -12073,9 +12298,9 @@ void case_972() -1, -1, 322, -1, 341, -1, -1, 344, 345, -1, 330, 331, -1, -1, 334, -1, -1, 337, -1, -1, -1, -1, 359, 360, 361, 362, 363, -1, -1, -1, - 367, -1, -1, -1, 371, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 371, -1, -1, -1, -1, -1, 377, 378, 379, 380, -1, -1, -1, 384, -1, 386, - 370, -1, -1, -1, -1, 392, 393, -1, -1, -1, + -1, -1, -1, -1, -1, 392, 393, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 256, -1, -1, -1, 417, 418, 419, 420, 264, 265, -1, 267, -1, -1, @@ -12111,82 +12336,42 @@ void case_972() -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 256, -1, -1, -1, 417, 418, 419, 420, 264, 265, -1, 267, -1, -1, 270, 271, -1, -1, -1, 275, - 276, 277, 418, 279, -1, -1, 265, -1, 267, 285, - -1, 270, 288, -1, -1, -1, 275, -1, -1, 295, - 279, -1, -1, -1, 300, -1, 302, 303, 304, 288, - -1, -1, -1, -1, -1, -1, 295, -1, -1, -1, - 316, 300, 318, 319, -1, 304, 322, -1, -1, 325, - -1, 327, -1, 329, 330, 331, 332, 316, 334, 318, - -1, -1, -1, 322, -1, 341, -1, -1, 344, 345, - -1, 330, 331, -1, -1, 334, -1, -1, 337, -1, + 276, 277, 418, 279, -1, -1, -1, -1, -1, 285, + -1, -1, 288, -1, -1, -1, -1, -1, -1, 295, + -1, -1, -1, -1, 300, -1, 302, 303, 304, -1, + -1, -1, -1, -1, -1, -1, 262, -1, -1, -1, + 316, -1, 318, 319, -1, -1, 322, -1, -1, 325, + -1, 327, -1, 329, 330, 331, 332, -1, 334, -1, + -1, -1, -1, -1, -1, 341, -1, -1, 344, 345, + -1, -1, 298, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 359, 360, 361, 362, 363, -1, -1, -1, -1, -1, -1, -1, 371, -1, -1, -1, -1, -1, 377, 378, 379, 380, -1, -1, -1, 384, -1, 386, -1, -1, -1, -1, -1, 392, 393, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, 256, -1, -1, - -1, 417, 418, 419, 420, 264, 265, -1, 267, -1, - -1, 270, 271, -1, -1, -1, 275, 276, 277, 418, - 279, -1, -1, 265, -1, 267, 285, -1, 270, 288, - -1, -1, -1, 275, -1, -1, 295, 279, -1, -1, - -1, 300, -1, 302, 303, 304, 288, -1, -1, -1, - -1, -1, -1, 295, -1, -1, -1, 316, 300, 318, - 319, -1, 304, 322, -1, -1, 325, -1, 327, -1, - 329, 330, 331, 332, 316, 334, 318, -1, -1, -1, - 322, -1, 341, -1, -1, 344, 345, -1, 330, 331, - -1, -1, 334, -1, -1, 337, -1, -1, -1, -1, - 359, 360, 361, 362, 363, -1, -1, -1, -1, -1, - -1, -1, 371, -1, -1, -1, -1, -1, 377, 378, - 379, 380, -1, -1, -1, 384, -1, 386, -1, -1, - -1, -1, -1, 392, 393, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, 256, -1, -1, -1, 417, 418, - 419, 420, 264, 265, -1, 267, -1, -1, 270, 271, - -1, -1, -1, 275, 276, 277, 418, 279, -1, -1, - -1, -1, -1, 285, -1, -1, 288, -1, -1, -1, - 261, -1, -1, 295, -1, -1, -1, 262, 300, -1, - 302, 303, 304, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, 284, 316, -1, 318, 319, -1, -1, - 322, -1, -1, 325, -1, 327, 297, 329, 330, 331, - 332, 302, 334, 298, -1, -1, 307, -1, 309, 310, - 311, 312, -1, -1, 315, -1, 317, -1, -1, -1, - 321, -1, -1, -1, -1, -1, -1, 359, 360, 361, - 362, -1, 333, -1, -1, 336, -1, 338, -1, 371, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, 362, -1, -1, -1, -1, -1, 368, 369, -1, - -1, -1, -1, -1, -1, -1, 371, 372, 373, 374, - 375, -1, -1, 378, 379, 417, 418, 382, 383, 384, - 385, 386, 387, 388, 389, 390, -1, 392, 393, 394, - 395, 396, 397, 398, 399, 400, 401, 402, 403, 404, - 405, 406, 407, 408, 409, 410, 411, 412, 413, -1, - 261, -1, 263, -1, 265, 420, 267, -1, 423, 270, - -1, 272, 273, -1, 275, -1, 277, -1, 279, -1, - 281, 282, 283, 284, -1, -1, 287, 288, -1, -1, - -1, -1, 293, 294, 295, 296, 297, -1, -1, 300, - -1, 302, -1, 304, -1, 306, 307, 308, 309, 310, - 311, 312, 313, -1, 315, 316, 317, 318, -1, -1, - 321, 322, 323, -1, 325, -1, -1, -1, -1, 330, - 331, -1, 333, 334, -1, 336, 337, 338, -1, -1, - -1, 342, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, 362, -1, 364, 365, 261, -1, -1, -1, 265, - -1, 267, -1, -1, 270, -1, 272, 273, -1, 275, - -1, 277, -1, 279, -1, 281, 282, 283, 284, -1, - -1, 287, 288, -1, -1, -1, -1, 293, -1, 295, - 296, 297, -1, -1, 300, -1, 302, -1, 304, -1, - -1, 307, -1, 309, 310, 311, 312, 418, -1, -1, - 316, 317, 318, -1, -1, 321, 322, 323, -1, -1, - -1, -1, -1, -1, 330, 331, -1, 333, 334, -1, - 336, 337, 338, -1, -1, -1, 342, -1, -1, -1, + -1, 417, 418, 419, 420, 371, 372, 373, 374, 375, + -1, -1, 378, 379, -1, -1, 382, 383, 384, 385, + 386, 387, 388, 389, 390, -1, 392, 393, 394, 395, + 396, 397, 398, 399, 400, 401, 402, 403, 404, 405, + 406, 407, 408, 409, 410, 411, 412, 413, -1, 261, + -1, 263, -1, 265, 420, 267, -1, 423, 270, -1, + 272, 273, -1, 275, -1, 277, -1, 279, -1, 281, + 282, 283, 284, -1, -1, 287, 288, -1, -1, -1, + -1, 293, 294, 295, 296, 297, -1, -1, 300, -1, + 302, -1, 304, -1, 306, 307, -1, 309, 310, 311, + 312, -1, -1, 315, 316, 317, 318, -1, -1, 321, + 322, 323, -1, -1, -1, -1, -1, -1, 330, 331, + -1, 333, 334, -1, 336, 337, 338, -1, -1, -1, + 342, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, 261, -1, 362, -1, 265, -1, - 267, -1, 368, 270, -1, 272, 273, -1, 275, -1, - 277, 377, 279, -1, 281, 282, 283, 284, -1, -1, + 362, -1, 364, 365, 261, -1, -1, -1, 265, -1, + 267, -1, -1, 270, -1, 272, 273, -1, 275, -1, + 277, -1, 279, -1, 281, 282, 283, 284, -1, -1, 287, 288, -1, -1, -1, -1, 293, -1, 295, 296, 297, -1, -1, 300, -1, 302, -1, 304, -1, -1, - 307, -1, 309, 310, 311, 312, -1, -1, -1, 316, - 317, 318, 418, -1, 321, 322, 323, -1, -1, -1, + 307, -1, 309, 310, 311, 312, 418, -1, -1, 316, + 317, 318, -1, -1, 321, 322, 323, -1, -1, -1, -1, -1, -1, 330, 331, -1, 333, 334, -1, 336, 337, 338, -1, -1, -1, 342, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, @@ -12199,338 +12384,338 @@ void case_972() 318, 418, -1, 321, 322, 323, -1, -1, -1, -1, -1, -1, 330, 331, -1, 333, 334, -1, 336, 337, 338, -1, -1, -1, 342, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, 261, -1, -1, - -1, 265, -1, 267, 362, -1, 270, -1, 272, 273, - 368, 275, -1, 277, -1, 279, -1, 281, 282, 283, - 284, -1, -1, 287, 288, -1, -1, -1, -1, 293, - -1, 295, 296, 297, -1, -1, 300, -1, 302, -1, - 304, -1, -1, 307, -1, 309, 310, 311, 312, -1, - -1, -1, 316, 317, 318, -1, -1, 321, 322, 323, - 418, -1, -1, -1, -1, -1, 330, 331, -1, 333, - 334, -1, 336, 337, 338, -1, -1, -1, 342, -1, - -1, -1, -1, 261, -1, -1, -1, 265, -1, 267, - -1, -1, 270, -1, 272, 273, -1, 275, 362, 277, - -1, 279, -1, 281, 282, 283, 284, -1, -1, 287, - 288, -1, -1, 377, -1, 293, -1, 295, 296, 297, - -1, -1, 300, -1, 302, 261, 304, -1, -1, 307, - -1, 309, 310, 311, 312, -1, -1, -1, 316, 317, - 318, -1, -1, 321, 322, 323, -1, -1, 284, -1, - -1, -1, 330, 331, 418, 333, 334, -1, 336, 337, - 338, 297, -1, -1, 342, -1, 302, -1, -1, 305, - -1, 307, -1, 309, 310, 311, 312, -1, -1, -1, - -1, 317, -1, -1, 362, 321, -1, -1, -1, 325, - 368, -1, -1, -1, -1, -1, -1, 333, -1, -1, - 336, -1, 338, 264, 265, -1, 267, -1, -1, 270, - 271, -1, -1, -1, 275, 276, 277, -1, 279, -1, - -1, 357, -1, -1, 285, -1, 362, 288, -1, -1, - -1, -1, -1, 369, 295, 371, -1, 373, -1, 300, - 418, 302, 303, 304, -1, 306, -1, -1, -1, -1, - 386, -1, 313, -1, -1, 316, -1, 318, 319, -1, - -1, 322, -1, -1, 325, -1, 327, -1, 329, 330, - 331, 332, -1, 334, -1, -1, -1, -1, -1, -1, - 341, -1, 418, 344, 345, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, 359, 360, - 361, 362, 363, -1, -1, -1, -1, -1, -1, -1, - 371, 372, -1, 374, -1, -1, 377, 378, 379, 380, - -1, -1, -1, 384, -1, 386, -1, -1, -1, -1, - -1, 392, 393, -1, -1, -1, -1, -1, -1, 264, - 265, -1, 267, -1, -1, 270, 271, -1, -1, -1, - 275, 276, 277, -1, 279, -1, 417, 418, 419, 420, - 285, -1, -1, 288, -1, -1, -1, -1, -1, -1, - 295, -1, -1, -1, -1, 300, -1, 302, 303, 304, - -1, 306, -1, -1, -1, -1, -1, -1, 313, -1, - -1, 316, -1, 318, 319, -1, -1, 322, -1, -1, - 325, -1, 327, -1, 329, 330, 331, 332, -1, 334, - -1, -1, -1, -1, -1, -1, 341, -1, -1, 344, - 345, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, 359, 360, 361, 362, 363, -1, - -1, -1, -1, -1, -1, -1, 371, -1, -1, 374, - -1, -1, 377, 378, 379, 380, -1, -1, -1, 384, - -1, 386, -1, -1, -1, -1, -1, 392, 393, -1, - -1, -1, -1, -1, -1, 264, 265, -1, 267, -1, - -1, 270, 271, -1, -1, -1, 275, 276, 277, -1, - 279, -1, 417, 418, 419, 420, 285, -1, -1, 288, - -1, -1, -1, -1, -1, -1, 295, -1, -1, -1, - -1, 300, -1, 302, 303, 304, -1, 306, -1, -1, - -1, -1, -1, -1, 313, -1, -1, 316, -1, 318, - 319, -1, -1, 322, -1, -1, 325, -1, 327, -1, - 329, 330, 331, 332, -1, 334, -1, -1, -1, -1, - -1, -1, 341, -1, -1, 344, 345, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - 359, 360, 361, 362, 363, -1, -1, -1, -1, -1, - -1, -1, 371, -1, -1, -1, -1, -1, 377, 378, - 379, 380, -1, -1, -1, 384, -1, 386, -1, -1, - -1, -1, -1, 392, 393, -1, -1, -1, -1, -1, - -1, 264, 265, -1, 267, -1, -1, 270, 271, -1, - -1, -1, 275, 276, 277, -1, 279, -1, 417, 418, - 419, 420, 285, -1, -1, 288, -1, -1, -1, -1, - -1, -1, 295, -1, -1, -1, -1, 300, -1, 302, - 303, 304, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, 316, -1, 318, 319, -1, -1, 322, - -1, -1, 325, -1, 327, -1, 329, 330, 331, 332, - -1, 334, -1, -1, 337, -1, -1, -1, 341, -1, - -1, 344, 345, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, 359, 360, 361, 362, - 363, -1, -1, -1, -1, -1, -1, -1, 371, -1, - -1, -1, -1, -1, 377, 378, 379, 380, -1, -1, - -1, 384, -1, 386, -1, -1, -1, -1, -1, 392, - 393, -1, -1, -1, -1, -1, -1, 264, 265, -1, - 267, -1, -1, 270, 271, -1, -1, -1, 275, 276, - 277, -1, 279, -1, 417, 418, 419, 420, 285, -1, - -1, 288, -1, -1, -1, -1, -1, -1, 295, -1, - -1, -1, -1, 300, -1, 302, 303, 304, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, 316, - -1, 318, 319, -1, -1, 322, -1, -1, 325, -1, - 327, -1, 329, 330, 331, 332, -1, 334, -1, -1, - -1, -1, -1, -1, 341, -1, -1, 344, 345, -1, + -1, -1, 261, -1, 362, -1, 265, -1, 267, -1, + 368, 270, -1, 272, 273, -1, 275, -1, 277, 377, + 279, -1, 281, 282, 283, 284, -1, -1, 287, 288, + -1, -1, -1, -1, 293, -1, 295, 296, 297, -1, + -1, 300, -1, 302, -1, 304, -1, -1, 307, -1, + 309, 310, 311, 312, -1, -1, -1, 316, 317, 318, + 418, -1, 321, 322, 323, -1, -1, -1, -1, -1, + -1, 330, 331, -1, 333, 334, -1, 336, 337, 338, + -1, -1, -1, 342, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 261, -1, -1, -1, + 265, -1, 267, 362, -1, 270, -1, 272, 273, 368, + 275, -1, 277, -1, 279, -1, 281, 282, 283, 284, + -1, -1, 287, 288, -1, -1, -1, -1, 293, -1, + 295, 296, 297, -1, -1, 300, -1, 302, -1, 304, + -1, -1, 307, -1, 309, 310, 311, 312, -1, -1, + -1, 316, 317, 318, -1, -1, 321, 322, 323, 418, + -1, -1, -1, -1, -1, 330, 331, -1, 333, 334, + -1, 336, 337, 338, -1, -1, -1, 342, -1, -1, + -1, -1, 261, -1, -1, -1, 265, -1, 267, -1, + -1, 270, -1, 272, 273, -1, 275, 362, 277, -1, + 279, -1, 281, 282, 283, 284, -1, -1, 287, 288, + -1, -1, 377, -1, 293, -1, 295, 296, 297, -1, + -1, 300, -1, 302, 261, 304, -1, -1, 307, -1, + 309, 310, 311, 312, -1, -1, -1, 316, 317, 318, + -1, -1, 321, 322, 323, -1, -1, 284, -1, -1, + -1, 330, 331, 418, 333, 334, -1, 336, 337, 338, + 297, -1, -1, 342, -1, 302, -1, -1, 305, -1, + 307, -1, 309, 310, 311, 312, -1, -1, -1, -1, + 317, -1, -1, 362, 321, -1, -1, -1, 325, 368, + -1, -1, -1, -1, -1, -1, 333, -1, -1, 336, + -1, 338, 264, 265, -1, 267, -1, -1, 270, 271, + -1, -1, -1, 275, 276, 277, -1, 279, -1, -1, + 357, -1, -1, 285, -1, 362, 288, -1, -1, -1, + -1, -1, 369, 295, 371, -1, 373, -1, 300, 418, + 302, 303, 304, -1, 306, -1, -1, -1, -1, 386, + -1, 313, -1, -1, 316, -1, 318, 319, -1, -1, + 322, -1, -1, 325, -1, 327, -1, 329, 330, 331, + 332, -1, 334, -1, -1, -1, -1, -1, -1, 341, + -1, 418, 344, 345, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 359, 360, 361, + 362, 363, -1, -1, -1, -1, -1, -1, -1, 371, + 372, -1, 374, -1, -1, 377, 378, 379, 380, -1, + -1, -1, 384, -1, 386, -1, -1, -1, -1, -1, + 392, 393, -1, -1, -1, -1, -1, -1, 264, 265, + -1, 267, -1, -1, 270, 271, -1, -1, -1, 275, + 276, 277, -1, 279, -1, 417, 418, 419, 420, 285, + -1, -1, 288, -1, -1, -1, -1, -1, -1, 295, + -1, -1, -1, -1, 300, -1, 302, 303, 304, -1, + 306, -1, -1, -1, -1, -1, -1, 313, -1, -1, + 316, -1, 318, 319, -1, -1, 322, -1, -1, 325, + -1, 327, -1, 329, 330, 331, 332, -1, 334, -1, + -1, -1, -1, -1, -1, 341, -1, -1, 344, 345, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, 359, 360, 361, 362, 363, -1, -1, -1, - -1, 368, -1, -1, 371, -1, -1, -1, -1, -1, - 377, 378, 379, 380, -1, -1, -1, 384, -1, 386, - -1, -1, -1, -1, -1, 392, 393, -1, -1, -1, - -1, -1, -1, 264, 265, -1, 267, -1, -1, 270, - 271, -1, -1, -1, 275, 276, 277, -1, 279, -1, - 417, 418, 419, 420, 285, -1, -1, 288, -1, -1, - -1, -1, -1, -1, 295, -1, -1, -1, -1, 300, - -1, 302, 303, 304, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, 316, -1, 318, 319, -1, - -1, 322, -1, -1, 325, -1, 327, -1, 329, 330, - 331, 332, -1, 334, -1, -1, -1, -1, -1, -1, - 341, -1, -1, 344, 345, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, 359, 360, - 361, 362, 363, -1, -1, -1, 367, -1, -1, -1, - 371, -1, -1, -1, -1, -1, 377, 378, 379, 380, - -1, -1, -1, 384, -1, 386, -1, -1, -1, -1, - -1, 392, 393, -1, -1, -1, -1, -1, -1, 264, - 265, -1, 267, -1, -1, 270, 271, -1, -1, -1, - 275, 276, 277, -1, 279, -1, 417, 418, 419, 420, - 285, -1, -1, 288, -1, -1, -1, -1, -1, -1, - 295, -1, -1, -1, -1, 300, -1, 302, 303, 304, + -1, -1, -1, 359, 360, 361, 362, 363, -1, -1, + -1, -1, -1, -1, -1, 371, -1, -1, 374, -1, + -1, 377, 378, 379, 380, -1, -1, -1, 384, -1, + 386, -1, -1, -1, -1, -1, 392, 393, -1, -1, + -1, -1, -1, -1, 264, 265, -1, 267, -1, -1, + 270, 271, -1, -1, -1, 275, 276, 277, -1, 279, + -1, 417, 418, 419, 420, 285, -1, -1, 288, -1, + -1, -1, -1, -1, -1, 295, -1, -1, -1, -1, + 300, -1, 302, 303, 304, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 316, -1, 318, 319, + -1, -1, 322, -1, -1, 325, -1, 327, -1, 329, + 330, 331, 332, -1, 334, -1, -1, 337, -1, -1, + -1, 341, -1, -1, 344, 345, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 359, + 360, 361, 362, 363, -1, -1, -1, -1, -1, -1, + -1, 371, -1, -1, -1, -1, -1, 377, 378, 379, + 380, -1, -1, -1, 384, -1, 386, -1, -1, -1, + -1, -1, 392, 393, -1, -1, -1, -1, -1, -1, + 264, 265, -1, 267, -1, -1, 270, 271, -1, -1, + -1, 275, 276, 277, -1, 279, -1, 417, 418, 419, + 420, 285, -1, -1, 288, -1, -1, -1, -1, -1, + -1, 295, -1, -1, -1, -1, 300, -1, 302, 303, + 304, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 316, -1, 318, 319, -1, -1, 322, -1, + -1, 325, -1, 327, -1, 329, 330, 331, 332, -1, + 334, -1, -1, -1, -1, -1, -1, 341, -1, -1, + 344, 345, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 359, 360, 361, 362, 363, + -1, -1, -1, -1, 368, -1, -1, 371, -1, -1, + -1, -1, -1, 377, 378, 379, 380, -1, -1, -1, + 384, -1, 386, -1, -1, -1, -1, -1, 392, 393, + -1, -1, -1, -1, -1, -1, 264, 265, -1, 267, + -1, -1, 270, 271, -1, -1, -1, 275, 276, 277, + -1, 279, -1, 417, 418, 419, 420, 285, -1, -1, + 288, -1, -1, -1, -1, -1, -1, 295, -1, -1, + -1, -1, 300, -1, 302, 303, 304, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 316, -1, + 318, 319, -1, -1, 322, -1, -1, 325, -1, 327, + -1, 329, 330, 331, 332, -1, 334, -1, -1, -1, + -1, -1, -1, 341, -1, -1, 344, 345, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, 316, -1, 318, 319, -1, -1, 322, -1, -1, - 325, -1, 327, -1, 329, 330, 331, 332, -1, 334, - -1, -1, -1, -1, -1, -1, 341, -1, -1, 344, - 345, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, 359, 360, 361, 362, 363, -1, - -1, -1, 367, -1, -1, -1, 371, -1, -1, -1, - -1, -1, 377, 378, 379, 380, -1, -1, -1, 384, - -1, 386, -1, -1, -1, -1, -1, 392, 393, -1, - -1, -1, -1, -1, -1, 264, 265, -1, 267, -1, - -1, 270, 271, -1, -1, -1, 275, 276, 277, -1, - 279, -1, 417, 418, 419, 420, 285, -1, -1, 288, - -1, -1, -1, -1, -1, -1, 295, -1, -1, -1, - -1, 300, -1, 302, 303, 304, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, 316, -1, 318, - 319, -1, -1, 322, -1, -1, 325, -1, 327, -1, - 329, 330, 331, 332, -1, 334, -1, -1, -1, -1, - -1, -1, 341, -1, -1, 344, 345, -1, -1, -1, + -1, 359, 360, 361, 362, 363, -1, -1, -1, 367, + -1, -1, -1, 371, -1, -1, -1, -1, -1, 377, + 378, 379, 380, -1, -1, -1, 384, -1, 386, -1, + -1, -1, -1, -1, 392, 393, -1, -1, -1, -1, + -1, -1, 264, 265, -1, 267, -1, -1, 270, 271, + -1, -1, -1, 275, 276, 277, -1, 279, -1, 417, + 418, 419, 420, 285, -1, -1, 288, -1, -1, -1, + -1, -1, -1, 295, -1, -1, -1, -1, 300, -1, + 302, 303, 304, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 316, -1, 318, 319, -1, -1, + 322, -1, -1, 325, -1, 327, -1, 329, 330, 331, + 332, -1, 334, -1, -1, -1, -1, -1, -1, 341, + -1, -1, 344, 345, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 359, 360, 361, + 362, 363, -1, -1, -1, 367, -1, -1, -1, 371, + -1, -1, -1, -1, -1, 377, 378, 379, 380, -1, + -1, -1, 384, -1, 386, -1, -1, -1, -1, -1, + 392, 393, -1, -1, -1, -1, -1, -1, 264, 265, + -1, 267, -1, -1, 270, 271, -1, -1, -1, 275, + 276, 277, -1, 279, -1, 417, 418, 419, 420, 285, + -1, -1, 288, -1, -1, -1, -1, -1, -1, 295, + -1, -1, -1, -1, 300, -1, 302, 303, 304, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - 359, 360, 361, 362, 363, -1, -1, -1, -1, -1, - -1, -1, 371, -1, -1, -1, -1, -1, 377, 378, - 379, 380, -1, -1, -1, 384, -1, 386, -1, -1, - -1, -1, -1, 392, 393, -1, -1, -1, -1, -1, - -1, 264, 265, -1, 267, -1, -1, 270, 271, -1, - -1, -1, 275, 276, 277, -1, 279, -1, 417, 418, - 419, 420, 285, -1, -1, 288, -1, -1, -1, -1, - -1, -1, 295, -1, -1, -1, -1, 300, -1, 302, - 303, 304, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, 316, -1, 318, 319, -1, -1, 322, - -1, -1, 325, -1, 327, -1, 329, 330, 331, 332, - -1, 334, -1, -1, -1, -1, -1, -1, 341, -1, - -1, 344, 345, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, 359, 360, 361, 362, - 363, -1, -1, -1, -1, -1, -1, -1, 371, -1, - -1, -1, -1, -1, 377, 378, 379, 380, -1, -1, - -1, 384, -1, 386, -1, -1, -1, -1, -1, 392, - 393, -1, -1, -1, -1, -1, -1, 264, 265, -1, - 267, -1, -1, 270, 271, -1, -1, -1, 275, 276, - 277, -1, 279, -1, 417, 418, 419, 420, 285, -1, - -1, 288, -1, -1, -1, -1, -1, -1, 295, -1, - -1, -1, -1, 300, -1, 302, 303, 304, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, 316, - -1, 318, 319, -1, -1, 322, -1, -1, 325, -1, - 327, -1, 329, 330, 331, 332, -1, 334, -1, -1, - -1, -1, -1, -1, 341, -1, -1, 344, 345, -1, + 316, -1, 318, 319, -1, -1, 322, -1, -1, 325, + -1, 327, -1, 329, 330, 331, 332, -1, 334, -1, + -1, -1, -1, -1, -1, 341, -1, -1, 344, 345, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, 359, 360, 361, 362, 363, -1, -1, -1, - -1, -1, -1, -1, 371, -1, -1, -1, -1, -1, - 377, 378, 379, 380, -1, -1, -1, 384, -1, 386, - -1, -1, -1, -1, -1, 392, 393, -1, -1, -1, - -1, -1, -1, 264, 265, -1, 267, -1, -1, 270, - 271, -1, -1, -1, 275, 276, 277, -1, 279, -1, - 417, 418, 419, 420, 285, -1, -1, 288, -1, -1, - -1, -1, -1, -1, 295, -1, -1, -1, -1, 300, - -1, 302, 303, 304, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, 316, -1, 318, 319, -1, - -1, 322, -1, -1, 325, -1, 327, -1, 329, 330, - 331, 332, -1, 334, -1, -1, -1, -1, -1, -1, - 341, -1, -1, 344, 345, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, 359, 360, - 361, 362, 363, -1, -1, -1, -1, -1, -1, -1, - 371, -1, -1, -1, -1, -1, 377, 378, 379, 380, - -1, -1, -1, 384, -1, 386, -1, -1, -1, -1, - -1, 392, 393, -1, -1, -1, -1, -1, -1, 264, - 265, -1, 267, -1, -1, 270, 271, -1, -1, -1, - 275, 276, 277, -1, 279, -1, 417, 418, 419, 420, - 285, -1, -1, 288, -1, -1, -1, -1, -1, -1, - 295, -1, -1, -1, -1, 300, -1, 302, 303, 304, + -1, -1, -1, 359, 360, 361, 362, 363, -1, -1, + -1, -1, -1, -1, -1, 371, -1, -1, -1, -1, + -1, 377, 378, 379, 380, -1, -1, -1, 384, -1, + 386, -1, -1, -1, -1, -1, 392, 393, -1, -1, + -1, -1, -1, -1, 264, 265, -1, 267, -1, -1, + 270, 271, -1, -1, -1, 275, 276, 277, -1, 279, + -1, 417, 418, 419, 420, 285, -1, -1, 288, -1, + -1, -1, -1, -1, -1, 295, -1, -1, -1, -1, + 300, -1, 302, 303, 304, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 316, -1, 318, 319, + -1, -1, 322, -1, -1, 325, -1, 327, -1, 329, + 330, 331, 332, -1, 334, -1, -1, -1, -1, -1, + -1, 341, -1, -1, 344, 345, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 359, + 360, 361, 362, 363, -1, -1, -1, -1, -1, -1, + -1, 371, -1, -1, -1, -1, -1, 377, 378, 379, + 380, -1, -1, -1, 384, -1, 386, -1, -1, -1, + -1, -1, 392, 393, -1, -1, -1, -1, -1, -1, + 264, 265, -1, 267, -1, -1, 270, 271, -1, -1, + -1, 275, 276, 277, -1, 279, -1, 417, 418, 419, + 420, 285, -1, -1, 288, -1, -1, -1, -1, -1, + -1, 295, -1, -1, -1, -1, 300, -1, 302, 303, + 304, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 316, -1, 318, 319, -1, -1, 322, -1, + -1, 325, -1, 327, -1, 329, 330, 331, 332, -1, + 334, -1, -1, -1, -1, -1, -1, 341, -1, -1, + 344, 345, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 359, 360, 361, 362, 363, + -1, -1, -1, -1, -1, -1, -1, 371, -1, -1, + -1, -1, -1, 377, 378, 379, 380, -1, -1, -1, + 384, -1, 386, -1, -1, -1, -1, -1, 392, 393, + -1, -1, -1, -1, -1, -1, 264, 265, -1, 267, + -1, -1, 270, 271, -1, -1, -1, 275, 276, 277, + -1, 279, -1, 417, 418, 419, 420, 285, -1, -1, + 288, -1, -1, -1, -1, -1, -1, 295, -1, -1, + -1, -1, 300, -1, 302, 303, 304, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 316, -1, + 318, 319, -1, -1, 322, -1, -1, 325, -1, 327, + -1, 329, 330, 331, 332, -1, 334, -1, -1, -1, + -1, -1, -1, 341, -1, -1, 344, 345, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, 316, -1, 318, 319, -1, -1, 322, -1, -1, - 325, -1, 327, -1, 329, 330, 331, 332, -1, 334, - -1, -1, -1, -1, -1, -1, 341, -1, -1, 344, - 345, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, 359, 360, 361, 362, 363, -1, - -1, -1, -1, -1, -1, -1, 371, -1, -1, -1, - -1, -1, 377, 378, 379, 380, -1, -1, -1, 384, - -1, 386, -1, -1, -1, -1, -1, 392, 393, -1, - -1, -1, -1, -1, -1, 264, 265, -1, 267, -1, - -1, 270, 271, -1, -1, -1, 275, 276, 277, -1, - 279, -1, 417, 418, 419, 420, 285, -1, -1, 288, - -1, -1, -1, -1, -1, -1, 295, -1, 261, -1, - 263, 300, -1, 302, 303, 304, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, 316, -1, 318, - 319, 284, -1, 322, -1, -1, 325, -1, 327, -1, - 329, 330, 331, 332, 297, 334, -1, -1, -1, 302, - -1, -1, -1, -1, 307, -1, 309, 310, 311, 312, - -1, -1, -1, -1, 317, -1, -1, -1, 321, -1, - 359, 360, 361, 362, 363, -1, -1, -1, -1, -1, - 333, -1, 371, 336, -1, 338, -1, -1, 377, 378, - 379, 380, -1, -1, -1, 384, -1, 386, -1, -1, - -1, -1, -1, 392, 393, -1, -1, -1, -1, 362, - -1, -1, -1, -1, -1, 368, 369, -1, -1, -1, - -1, -1, -1, 263, -1, 265, -1, 267, 417, 418, - 270, 420, 272, 273, -1, 275, -1, 277, -1, 279, - -1, 281, 282, 283, -1, -1, -1, 287, 288, -1, - -1, -1, -1, 293, -1, 295, 296, -1, -1, -1, - 300, -1, -1, -1, 304, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, 315, 316, -1, 318, -1, - -1, -1, 322, 323, -1, -1, -1, -1, -1, -1, - 330, 331, 264, 265, 334, 267, -1, 337, 270, 271, - -1, -1, 342, 275, 276, 277, -1, 279, -1, -1, - -1, -1, -1, 285, -1, -1, 288, -1, -1, -1, - -1, -1, -1, 295, 364, 365, -1, -1, 300, -1, - 302, 303, 304, -1, -1, -1, -1, 377, -1, -1, + -1, 359, 360, 361, 362, 363, -1, -1, -1, -1, + -1, -1, -1, 371, -1, -1, -1, -1, -1, 377, + 378, 379, 380, -1, -1, -1, 384, -1, 386, -1, + -1, -1, -1, -1, 392, 393, -1, -1, -1, -1, + -1, -1, 264, 265, -1, 267, -1, -1, 270, 271, + -1, -1, -1, 275, 276, 277, -1, 279, -1, 417, + 418, 419, 420, 285, -1, -1, 288, -1, -1, -1, + -1, -1, -1, 295, -1, -1, -1, -1, 300, -1, + 302, 303, 304, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 316, -1, 318, 319, -1, -1, 322, -1, -1, 325, -1, 327, -1, 329, 330, 331, - 332, -1, 334, -1, -1, 337, -1, -1, -1, -1, - -1, -1, 265, -1, 267, -1, -1, 270, 418, 272, - -1, -1, 275, -1, -1, -1, 279, 359, 360, 361, - 362, -1, -1, -1, -1, 288, 265, -1, 267, 371, - -1, 270, 295, 272, 273, -1, 275, 300, 277, 302, - 279, 304, 281, 282, 283, -1, -1, -1, 287, 288, - -1, -1, -1, 316, 293, 318, 295, 296, -1, 322, - 323, 300, -1, -1, -1, 304, -1, 330, 331, -1, - -1, 334, -1, -1, 337, 417, 418, 316, -1, 318, - -1, -1, -1, 322, 323, -1, -1, -1, -1, -1, - -1, 330, 331, -1, 265, 334, 267, -1, 337, 270, - -1, 272, 273, 342, 275, -1, 277, -1, 279, -1, - 281, 282, 283, -1, -1, -1, 287, 288, -1, -1, - -1, -1, 293, -1, 295, 296, -1, -1, -1, 300, - -1, -1, -1, 304, -1, -1, -1, -1, 377, -1, - -1, -1, -1, -1, -1, 316, -1, 318, -1, -1, - -1, 322, 323, -1, -1, 418, -1, -1, -1, 330, - 331, -1, -1, 334, -1, -1, 337, -1, 265, -1, - 267, 342, -1, 270, -1, -1, 273, -1, 275, 418, + 332, -1, 334, -1, -1, -1, -1, -1, -1, 341, + -1, -1, 344, 345, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 359, 360, 361, + 362, 363, -1, -1, -1, -1, -1, -1, -1, 371, + -1, -1, -1, -1, -1, 377, 378, 379, 380, -1, + -1, -1, 384, -1, 386, -1, -1, -1, -1, -1, + 392, 393, -1, -1, -1, -1, -1, -1, 264, 265, + -1, 267, -1, -1, 270, 271, -1, -1, -1, 275, + 276, 277, -1, 279, -1, 417, 418, 419, 420, 285, + -1, -1, 288, -1, -1, -1, -1, -1, -1, 295, + -1, 261, -1, -1, 300, -1, 302, 303, 304, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 316, -1, 318, 319, 284, -1, 322, -1, -1, 325, + -1, 327, -1, 329, 330, 331, 332, 297, 334, -1, + -1, -1, 302, -1, -1, -1, -1, 307, -1, 309, + 310, 311, 312, -1, -1, 315, -1, 317, -1, -1, + -1, 321, -1, 359, 360, 361, 362, 363, -1, -1, + -1, -1, -1, 333, -1, 371, 336, -1, 338, -1, + -1, 377, 378, 379, 380, -1, -1, -1, 384, -1, + 386, -1, -1, -1, -1, -1, 392, 393, -1, -1, + -1, -1, 362, -1, -1, -1, -1, -1, 368, 369, + -1, -1, -1, -1, -1, -1, 263, -1, 265, -1, + 267, 417, 418, 270, 420, 272, 273, -1, 275, -1, 277, -1, 279, -1, 281, 282, 283, -1, -1, -1, - 287, 288, -1, -1, -1, -1, 293, -1, 295, -1, - 265, -1, 267, 300, -1, 270, -1, 304, 273, -1, - 275, -1, 277, -1, 279, -1, 281, 282, 283, 316, - -1, 318, 287, 288, -1, 322, -1, -1, 293, -1, - 295, -1, -1, 330, 331, 300, -1, 334, -1, 304, - 337, -1, -1, -1, 265, 342, 267, 418, -1, 270, - -1, 316, -1, 318, 275, -1, -1, 322, 279, -1, - -1, -1, -1, -1, -1, 330, 331, 288, -1, 334, - -1, -1, 337, -1, 295, -1, 265, 342, 267, 300, - 377, 270, -1, 304, -1, 306, 275, 308, -1, -1, - 279, -1, 313, -1, -1, 316, -1, 318, -1, 288, - -1, 322, -1, -1, 325, -1, 295, -1, -1, 330, - 331, 300, -1, 334, -1, 304, 337, 306, -1, 308, - 265, 418, 267, -1, 313, 270, -1, 316, -1, 318, - 275, -1, -1, 322, 279, -1, 325, -1, -1, -1, - -1, 330, 331, 288, -1, 334, -1, -1, 337, -1, - 295, 372, 265, 418, 267, 300, -1, 270, -1, 304, - -1, 306, 275, 308, -1, -1, 279, -1, 313, -1, - -1, 316, -1, 318, -1, 288, -1, 322, -1, -1, - 325, 370, 295, -1, -1, 330, 331, 300, -1, 334, - -1, 304, 337, 306, -1, -1, 265, 418, 267, -1, - 313, 270, -1, 316, -1, 318, 275, -1, -1, 322, - 279, -1, 325, -1, -1, -1, -1, 330, 331, 288, - -1, 334, -1, -1, 337, -1, 295, -1, -1, 418, - -1, 300, -1, -1, -1, 304, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, 265, 316, 267, 318, - -1, 270, -1, 322, -1, -1, 275, -1, -1, -1, - 279, 330, 331, -1, -1, 334, -1, -1, 337, 288, - -1, -1, -1, 418, -1, -1, 295, -1, 265, -1, - 267, 300, -1, 270, -1, 304, -1, -1, 275, -1, - -1, -1, 279, -1, 363, -1, -1, 316, -1, 318, - -1, 288, -1, 322, -1, 418, -1, -1, 295, -1, - -1, 330, 331, 300, -1, 334, -1, 304, 337, -1, - -1, -1, 265, -1, 267, -1, -1, 270, -1, 316, - -1, 318, 275, -1, -1, 322, 279, -1, -1, -1, - -1, -1, -1, 330, 331, 288, -1, 334, -1, 418, - 337, -1, 295, -1, 265, -1, 267, 300, -1, 270, - -1, 304, -1, -1, 275, -1, -1, -1, 279, -1, - -1, -1, -1, 316, -1, 318, -1, 288, -1, 322, - -1, -1, -1, -1, 295, -1, -1, 330, 331, 300, - -1, 334, 261, 304, 337, -1, -1, -1, -1, 418, - -1, -1, -1, 272, -1, 316, -1, 318, 277, -1, - -1, 322, 281, -1, -1, 284, -1, -1, -1, 330, - 331, -1, -1, 334, -1, -1, 337, 296, 297, -1, - -1, 418, 301, 302, -1, -1, -1, -1, 307, -1, - 309, 310, 311, 312, -1, -1, -1, -1, 317, -1, - -1, -1, 321, -1, 323, -1, -1, -1, -1, -1, - -1, -1, -1, -1, 333, -1, 335, 336, 261, 338, - -1, -1, -1, 342, -1, 418, -1, -1, -1, 272, - -1, -1, -1, -1, 277, -1, -1, -1, 281, -1, - -1, 284, -1, 362, -1, -1, -1, -1, -1, 368, - 369, -1, -1, 296, 297, -1, -1, 418, 301, 302, - -1, 261, -1, -1, 307, -1, 309, 310, 311, 312, - -1, -1, 272, -1, 317, -1, -1, 277, 321, -1, - 323, 281, -1, -1, 284, -1, -1, -1, -1, -1, - 333, -1, -1, 336, -1, 338, 296, 297, -1, 342, - -1, 301, 302, -1, 261, -1, -1, 307, -1, 309, - 310, 311, 312, -1, -1, 272, -1, 317, -1, 362, - 277, 321, -1, 323, 281, 368, 369, 284, -1, -1, - -1, -1, -1, 333, -1, -1, 336, -1, 338, 296, - 297, -1, 342, -1, 301, 302, 261, -1, -1, -1, - 307, -1, 309, 310, 311, 312, -1, -1, -1, -1, - 317, -1, 362, -1, 321, -1, 323, -1, 368, 284, - -1, -1, -1, -1, -1, -1, 333, -1, -1, 336, - -1, 338, 297, -1, 261, 342, -1, 302, -1, -1, - -1, -1, 307, -1, 309, 310, 311, 312, -1, -1, - -1, -1, 317, -1, -1, 362, 321, 284, -1, -1, - -1, 368, -1, -1, -1, -1, -1, -1, 333, -1, - 297, 336, 261, 338, -1, 302, -1, -1, -1, -1, + 287, 288, -1, -1, -1, -1, 293, -1, 295, 296, + -1, -1, -1, 300, -1, -1, -1, 304, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 315, 316, + -1, 318, -1, -1, -1, 322, 323, -1, -1, -1, + -1, -1, -1, 330, 331, 264, 265, 334, 267, -1, + 337, 270, 271, -1, -1, 342, 275, 276, 277, -1, + 279, -1, -1, -1, -1, -1, 285, -1, -1, 288, + -1, -1, -1, -1, -1, -1, 295, 364, 365, -1, + -1, 300, -1, 302, 303, 304, -1, -1, -1, -1, + 377, -1, -1, -1, -1, -1, -1, 316, -1, 318, + 319, -1, -1, 322, -1, -1, 325, -1, 327, -1, + 329, 330, 331, 332, -1, 334, -1, -1, 337, -1, + -1, -1, -1, -1, -1, 265, -1, 267, -1, -1, + 270, 418, 272, -1, -1, 275, -1, -1, -1, 279, + 359, 360, 361, 362, -1, -1, -1, -1, 288, 265, + -1, 267, 371, -1, 270, 295, 272, 273, -1, 275, + 300, 277, 302, 279, 304, 281, 282, 283, -1, -1, + -1, 287, 288, -1, -1, -1, 316, 293, 318, 295, + 296, -1, 322, 323, 300, -1, -1, -1, 304, -1, + 330, 331, -1, -1, 334, -1, -1, 337, 417, 418, + 316, -1, 318, -1, -1, -1, 322, 323, -1, -1, + -1, -1, -1, -1, 330, 331, -1, 265, 334, 267, + -1, 337, 270, -1, 272, 273, 342, 275, -1, 277, + -1, 279, -1, 281, 282, 283, -1, -1, -1, 287, + 288, -1, -1, -1, -1, 293, -1, 295, 296, -1, + -1, -1, 300, -1, -1, -1, 304, -1, -1, -1, + -1, 377, -1, -1, -1, -1, -1, -1, 316, -1, + 318, -1, -1, -1, 322, 323, -1, -1, 418, -1, + -1, -1, 330, 331, -1, -1, 334, -1, -1, 337, + -1, 265, -1, 267, 342, -1, 270, -1, -1, 273, + -1, 275, 418, 277, -1, 279, -1, 281, 282, 283, + -1, -1, -1, 287, 288, -1, -1, -1, -1, 293, + -1, 295, -1, 265, -1, 267, 300, -1, 270, -1, + 304, 273, -1, 275, -1, 277, -1, 279, -1, 281, + 282, 283, 316, -1, 318, 287, 288, -1, 322, -1, + -1, 293, -1, 295, -1, -1, 330, 331, 300, -1, + 334, -1, 304, 337, -1, -1, -1, 265, 342, 267, + 418, -1, 270, -1, 316, -1, 318, 275, -1, -1, + 322, 279, -1, -1, -1, -1, -1, -1, 330, 331, + 288, -1, 334, -1, -1, 337, -1, 295, -1, 265, + 342, 267, 300, 377, 270, -1, 304, -1, 306, 275, + 308, -1, -1, 279, -1, 313, -1, -1, 316, -1, + 318, -1, 288, -1, 322, -1, -1, 325, -1, 295, + -1, -1, 330, 331, 300, -1, 334, -1, 304, 337, + 306, -1, 308, 265, 418, 267, -1, 313, 270, -1, + 316, -1, 318, 275, -1, -1, 322, 279, -1, 325, + -1, -1, -1, -1, 330, 331, 288, -1, 334, -1, + -1, 337, -1, 295, 372, 265, 418, 267, 300, -1, + 270, -1, 304, -1, 306, 275, 308, -1, -1, 279, + -1, 313, -1, -1, 316, -1, 318, -1, 288, -1, + 322, -1, -1, 325, 370, 295, -1, -1, 330, 331, + 300, -1, 334, -1, 304, 337, 306, -1, 308, 265, + 418, 267, -1, 313, 270, -1, 316, -1, 318, 275, + -1, -1, 322, 279, -1, 325, -1, -1, -1, -1, + 330, 331, 288, -1, 334, -1, -1, 337, -1, 295, + -1, -1, 418, -1, 300, -1, -1, -1, 304, -1, + 306, -1, -1, -1, 265, -1, 267, 313, -1, 270, + 316, -1, 318, -1, 275, -1, 322, -1, 279, 325, + -1, -1, 283, -1, 330, 331, -1, 288, 334, -1, + -1, 337, 293, -1, 295, -1, 418, -1, -1, 300, + -1, -1, -1, 304, 305, -1, -1, -1, 265, -1, + 267, -1, -1, 270, -1, 316, -1, 318, 275, -1, + -1, 322, 279, -1, -1, -1, -1, -1, 418, 330, + 331, 288, 265, 334, 267, -1, -1, 270, 295, -1, + -1, -1, 275, 300, -1, -1, 279, 304, -1, -1, + -1, -1, -1, -1, -1, 288, -1, -1, -1, 316, + -1, 318, 295, -1, -1, 322, -1, 300, -1, -1, + -1, 304, 418, 330, 331, -1, -1, 334, -1, -1, + 337, -1, -1, 316, -1, 318, 265, -1, 267, 322, + -1, 270, -1, -1, -1, -1, 275, 330, 331, -1, + 279, 334, -1, -1, 337, -1, 363, -1, -1, 288, + -1, -1, -1, -1, -1, -1, 295, 418, -1, -1, + -1, 300, -1, -1, 261, 304, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 272, -1, 316, -1, 318, + 277, -1, -1, 322, 281, -1, -1, 284, -1, -1, + -1, 330, 331, -1, -1, 334, -1, -1, 337, 296, + 297, 418, -1, -1, 301, 302, -1, -1, -1, -1, 307, -1, 309, 310, 311, 312, -1, -1, -1, -1, - 317, -1, -1, -1, 321, 284, -1, 362, -1, 364, - 365, -1, -1, 368, -1, -1, 333, -1, 297, 336, - 261, 338, 263, 302, -1, -1, -1, -1, 307, -1, - 309, 310, 311, 312, -1, -1, 315, -1, 317, -1, - -1, -1, 321, 284, -1, 362, -1, 364, 365, -1, - -1, 368, -1, -1, 333, -1, 297, 336, 261, 338, - -1, 302, -1, -1, -1, -1, 307, -1, 309, 310, + 317, -1, -1, -1, 321, 418, 323, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 333, -1, 335, 336, + 261, 338, -1, -1, -1, 342, -1, -1, -1, -1, + -1, 272, -1, -1, -1, -1, 277, -1, -1, -1, + 281, -1, -1, 284, -1, 362, -1, -1, -1, -1, + -1, 368, 369, -1, -1, 296, 297, -1, -1, 418, + 301, 302, 261, -1, 263, -1, 307, -1, 309, 310, 311, 312, -1, -1, -1, -1, 317, -1, -1, -1, - 321, 284, -1, 362, -1, -1, -1, -1, 261, 368, - 263, -1, 333, -1, 297, 336, -1, 338, -1, 302, - -1, -1, -1, -1, 307, -1, 309, 310, 311, 312, - -1, 284, -1, -1, 317, -1, -1, -1, 321, -1, - -1, 362, -1, -1, 297, -1, -1, 368, 261, 302, - 333, -1, -1, 336, 307, 338, 309, 310, 311, 312, - -1, -1, 315, -1, 317, -1, -1, -1, 321, -1, - -1, 284, -1, -1, -1, -1, -1, -1, 261, 362, - 333, 364, 365, 336, 297, 338, -1, -1, 301, 302, + 321, -1, 323, -1, -1, 284, -1, -1, -1, -1, + -1, -1, 333, -1, -1, 336, -1, 338, 297, -1, + -1, 342, -1, 302, -1, -1, -1, -1, 307, -1, + 309, 310, 311, 312, -1, -1, -1, -1, 317, -1, + -1, 362, 321, -1, -1, 261, -1, 368, 369, -1, + -1, -1, -1, -1, 333, -1, 272, 336, -1, 338, + -1, 277, -1, -1, -1, 281, -1, -1, 284, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 296, 297, -1, 362, -1, 301, 302, -1, 261, 368, + 369, 307, -1, 309, 310, 311, 312, -1, -1, 272, + -1, 317, -1, -1, 277, 321, -1, 323, 281, -1, + -1, 284, -1, -1, -1, -1, -1, 333, -1, -1, + 336, -1, 338, 296, 297, -1, 342, -1, 301, 302, + 261, -1, -1, -1, 307, -1, 309, 310, 311, 312, + -1, -1, -1, -1, 317, -1, 362, -1, 321, -1, + 323, -1, 368, 284, -1, -1, -1, -1, -1, -1, + 333, -1, -1, 336, -1, 338, 297, -1, 261, 342, + -1, 302, -1, -1, -1, -1, 307, -1, 309, 310, + 311, 312, -1, -1, -1, -1, 317, -1, -1, 362, + 321, 284, -1, -1, -1, 368, -1, -1, -1, -1, + -1, -1, 333, -1, 297, 336, 261, 338, -1, 302, -1, -1, -1, -1, 307, -1, 309, 310, 311, 312, - -1, 284, -1, -1, 317, -1, -1, -1, 321, 362, - -1, -1, -1, -1, 297, -1, -1, -1, -1, 302, - 333, -1, -1, 336, 307, 338, 309, 310, 311, 312, - -1, -1, -1, -1, 317, -1, -1, -1, 321, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, 362, - 333, -1, -1, 336, -1, 338, -1, -1, -1, -1, + -1, -1, -1, -1, 317, -1, -1, -1, 321, 284, + -1, 362, -1, 364, 365, -1, -1, 368, -1, -1, + 333, -1, 297, 336, 261, 338, 263, 302, -1, -1, + -1, -1, 307, -1, 309, 310, 311, 312, -1, -1, + 315, -1, 317, -1, -1, -1, 321, 284, -1, 362, + -1, 364, 365, -1, -1, 368, -1, -1, 333, -1, + 297, 336, 261, 338, 263, 302, -1, -1, -1, -1, + 307, -1, 309, 310, 311, 312, -1, -1, -1, -1, + 317, -1, -1, -1, 321, 284, -1, 362, -1, -1, + -1, -1, 261, 368, -1, -1, 333, -1, 297, 336, + -1, 338, -1, 302, -1, -1, -1, -1, 307, -1, + 309, 310, 311, 312, -1, 284, 315, -1, 317, -1, + -1, -1, 321, -1, 261, 362, -1, -1, 297, -1, + -1, 368, 301, 302, 333, -1, -1, 336, 307, 338, + 309, 310, 311, 312, -1, -1, -1, 284, 317, -1, + -1, -1, 321, -1, -1, -1, -1, -1, -1, -1, + 297, -1, -1, 362, 333, 302, -1, 336, -1, 338, + 307, -1, 309, 310, 311, 312, -1, -1, -1, -1, + 317, -1, -1, -1, 321, -1, -1, -1, -1, -1, + -1, -1, -1, 362, -1, -1, 333, -1, -1, 336, + -1, 338, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, 362, + -1, -1, -1, -1, -1, 362, }; -#line 6565 "cs-parser.jay" +#line 6611 "cs-parser.jay" // // A class used to hold info about an operator declarator @@ -12744,10 +12929,10 @@ public void parse () report.Error (-25, lexer.Location, "Parsing error"); } else { // Used by compiler-tester to test internal errors - if (yacc_verbose_flag > 0) + if (yacc_verbose_flag > 0 || e is FatalException) throw; - report.Error (589, lexer.Location, "Internal compiler error during parsing"); + report.Error (589, lexer.Location, "Internal compiler error during parsing" + e); } } } diff --git a/src/Libraries/NRefactory/ICSharpCode.NRefactory.CSharp/Parser/mcs/cs-parser.jay b/src/Libraries/NRefactory/ICSharpCode.NRefactory.CSharp/Parser/mcs/cs-parser.jay index 6231438e12..6e2e26750c 100644 --- a/src/Libraries/NRefactory/ICSharpCode.NRefactory.CSharp/Parser/mcs/cs-parser.jay +++ b/src/Libraries/NRefactory/ICSharpCode.NRefactory.CSharp/Parser/mcs/cs-parser.jay @@ -400,6 +400,8 @@ outer_declaration Attributes attrs = (Attributes) $4; report.Error (1730, attrs.Attrs [0].Location, "Assembly and module attributes must precede all other elements except using clauses and extern alias declarations"); + + current_namespace.UnattachedAttributes = attrs; } } | opt_extern_alias_directives opt_using_directives attribute_sections @@ -618,9 +620,7 @@ namespace_or_type_declaration current_namespace.DeclarationFound = true; } | attribute_sections CLOSE_BRACE { -#if FULL_AST current_namespace.UnattachedAttributes = (Attributes) $1; -#endif report.Error (1518, lexer.Location, "Attributes must be attached to class, delegate, enum, interface or struct"); lexer.putback ('}'); } @@ -1521,12 +1521,18 @@ fixed_parameter $$ = new Parameter ((FullNamedExpression) $3, lt.Value, (Parameter.Modifier) $2, (Attributes) $1, lt.Location); lbag.AddLocation ($$, parameterModifierLocation); } + | attribute_sections error + { + Error_SyntaxError (yyToken); + Location l = GetLocation ($2); + $$ = new Parameter (null, null, Parameter.Modifier.NONE, (Attributes) $1, l); + } | opt_attributes opt_parameter_modifier parameter_type error { - Error_SyntaxError (yyToken); + Error_SyntaxError (yyToken); Location l = GetLocation ($4); $$ = new Parameter ((FullNamedExpression) $3, null, (Parameter.Modifier) $2, (Attributes) $1, l); lbag.AddLocation ($$, parameterModifierLocation); @@ -2536,10 +2542,9 @@ event_accessor_block ; attributes_without_members - : attribute_sections CLOSE_BRACE { -#if FULL_AST + : attribute_sections CLOSE_BRACE + { current_type.UnattachedAttributes = (Attributes) $1; -#endif report.Error (1519, GetLocation ($1), "An attribute is missing member declaration"); lexer.putback ('}'); } @@ -2565,7 +2570,7 @@ enum_declaration report.Error (1675, name.Location, "Enums cannot have type parameters"); } - push_current_container (new Enum (current_container, (TypeExpression) $5, (Modifiers) $2, name, (Attributes) $1), null); + push_current_container (new Enum (current_container, (FullNamedExpression) $5, (Modifiers) $2, name, (Attributes) $1), null); if ($5 != null) { lbag.AddMember (current_container, GetModifierLocations (), GetLocation ($3), savedLocation, GetLocation ($7)); } else { @@ -2600,14 +2605,8 @@ opt_enum_base : /* empty */ | COLON type { - var te = $2 as TypeExpression; - if (te == null || !EnumSpec.IsValidUnderlyingType (te.Type)) { - Enum.Error_1008 (GetLocation ($2), report); - $$ = null; - } else { - savedLocation = GetLocation ($1); - $$ = $2; - } + savedLocation = GetLocation ($1); + $$ = $2; } | COLON error { @@ -3326,10 +3325,10 @@ argument_list lbag.AppendTo (list, GetLocation ($2)); $$ = list; } - | argument_list COMMA + | argument_list COMMA error { - report.Error (839, GetLocation ($2), "An argument is missing"); - $$ = $1; + Error_SyntaxError (yyToken); + $$ = $1; } | COMMA error { @@ -3386,10 +3385,12 @@ element_access } | primary_expression OPEN_BRACKET_EXPR expression_list_arguments error { + Error_SyntaxError (yyToken); $$ = new ElementAccess ((Expression) $1, (Arguments) $3, GetLocation ($2)); } | primary_expression OPEN_BRACKET_EXPR error { + Error_SyntaxError (yyToken); $$ = new ElementAccess ((Expression) $1, null, GetLocation ($2)); } ; @@ -3530,8 +3531,9 @@ array_creation_expression } | NEW new_expr_type error { - Error_SyntaxError (1526, yyToken, "Unexpected symbol"); - $$ = new ArrayCreation ((FullNamedExpression) $2, null, GetLocation ($1)); + Error_SyntaxError (yyToken); + // It can be any of new expression, create the most common one + $$ = new New ((FullNamedExpression) $2, null, GetLocation ($1)); } ; @@ -3899,8 +3901,16 @@ unary_expression | AWAIT prefixed_unary_expression { if (!async_block) { - report.Error (1992, GetLocation ($1), - "The `await' operator can only be used when its containing method or lambda expression is marked with the `async' modifier"); + if (current_anonymous_method is LambdaExpression) { + report.Error (4034, GetLocation ($1), + "The `await' operator can only be used when its containing lambda expression is marked with the `async' modifier"); + } else if (current_anonymous_method is AnonymousMethodExpression) { + report.Error (4035, GetLocation ($1), + "The `await' operator can only be used when its containing anonymous method is marked with the `async' modifier"); + } else { + report.Error (4033, GetLocation ($1), + "The `await' operator can only be used when its containing method is marked with the `async' modifier"); + } } else { current_block.Explicit.RegisterAsyncAwait (); } @@ -4101,6 +4111,11 @@ conditional_expression $$ = new Conditional (new BooleanExpression ((Expression) $1), (Expression) $3, (Expression) $5, GetLocation ($2)); lbag.AddLocation ($$, GetLocation ($4)); } + | null_coalescing_expression INTERR expression error + { + Error_SyntaxError (yyToken); + $$ = new Conditional (new BooleanExpression ((Expression) $1), (Expression) $3, null, GetLocation ($2)); + } ; assignment_expression @@ -5293,6 +5308,11 @@ switch_label $$ = new SwitchLabel ((Expression) $2, GetLocation ($1)); lbag.AddLocation ($$, GetLocation ($3)); } + | CASE constant_expression error + { + Error_SyntaxError (yyToken); + $$ = new SwitchLabel ((Expression) $2, GetLocation ($1)); + } | DEFAULT_COLON { $$ = new SwitchLabel (null, GetLocation ($1)); @@ -5394,7 +5414,7 @@ for_statement_condition { $$ = $4; } - | opt_for_condition CLOSE_PARENS { + | boolean_expression CLOSE_PARENS { report.Error (1525, GetLocation ($2), "Unexpected symbol ')', expected ';'"); For f = (For) $0; f.Condition = (BooleanExpression) $1; @@ -5471,6 +5491,7 @@ statement_expression_list } else { sl.Add ((Statement) $3); lbag.AppendTo (sl, GetLocation ($2)); + } $$ = sl; @@ -5485,7 +5506,7 @@ foreach_statement start_block (GetLocation ($2)); current_block.IsCompilerGenerated = true; - Foreach f = new Foreach ((Expression) $3, null, null, null, GetLocation ($1)); + Foreach f = new Foreach ((Expression) $3, null, null, null, null, GetLocation ($1)); current_block.AddStatement (f); lbag.AddStatement (f, GetLocation ($2)); @@ -5494,7 +5515,7 @@ foreach_statement | FOREACH open_parens_any type identifier_inside_body error { Error_SyntaxError (yyToken); - + start_block (GetLocation ($2)); current_block.IsCompilerGenerated = true; @@ -5502,7 +5523,7 @@ foreach_statement var li = new LocalVariable (current_block, lt.Value, LocalVariable.Flags.ForeachVariable | LocalVariable.Flags.Used, lt.Location); current_block.AddLocalName (li); - Foreach f = new Foreach ((Expression) $3, li, null, null, GetLocation ($1)); + Foreach f = new Foreach ((Expression) $3, li, null, null, null, GetLocation ($1)); current_block.AddStatement (f); lbag.AddStatement (f, GetLocation ($2)); @@ -5521,12 +5542,12 @@ foreach_statement { if ($9 is EmptyStatement && lexer.peek_token () == Token.OPEN_BRACE) Warning_EmptyStatement (GetLocation ($9)); - - Foreach f = new Foreach ((Expression) $3, (LocalVariable) $8, (Expression) $6, (Statement) $9, GetLocation ($1)); - current_block.AddStatement (f); + Foreach f = new Foreach ((Expression) $3, (LocalVariable) $8, (Expression) $6, (Statement) $9, current_block, GetLocation ($1)); lbag.AddStatement (f, GetLocation ($2), GetLocation ($5), GetLocation ($7)); - $$ = end_block (GetLocation ($7)); + end_block (GetLocation ($7)); + + $$ = f; } | FOREACH open_parens_any type identifier_inside_body error { @@ -5535,7 +5556,7 @@ foreach_statement var lt = $4 as Tokenizer.LocatedToken; var li = lt != null ? new LocalVariable (current_block, lt.Value, LocalVariable.Flags.ForeachVariable | LocalVariable.Flags.Used, lt.Location) : null; - Foreach f = new Foreach ((Expression) $3, li, null, null, GetLocation ($1)); + Foreach f = new Foreach ((Expression) $3, li, null, null, null, GetLocation ($1)); current_block.AddStatement (f); lbag.AddStatement (f, GetLocation ($2)); @@ -5543,7 +5564,7 @@ foreach_statement } | FOREACH open_parens_any type error { - Foreach f = new Foreach ((Expression) $3, null, null, null, GetLocation ($1)); + Foreach f = new Foreach ((Expression) $3, null, null, null, null, GetLocation ($1)); current_block.AddStatement (f); lbag.AddStatement (f, GetLocation ($2)); @@ -5574,6 +5595,11 @@ continue_statement $$ = new Continue (GetLocation ($1)); lbag.AddStatement ($$, GetLocation ($2)); } + | CONTINUE error + { + Error_SyntaxError (yyToken); + $$ = new Continue (GetLocation ($1)); + } ; goto_statement @@ -5601,6 +5627,11 @@ return_statement $$ = new Return ((Expression) $2, GetLocation ($1)); lbag.AddStatement ($$, GetLocation ($3)); } + | RETURN error + { + Error_SyntaxError (yyToken); + $$ = new Return (null, GetLocation ($1)); + } ; throw_statement @@ -5609,6 +5640,11 @@ throw_statement $$ = new Throw ((Expression) $2, GetLocation ($1)); lbag.AddStatement ($$, GetLocation ($3)); } + | THROW error + { + Error_SyntaxError (yyToken); + $$ = new Throw (null, GetLocation ($1)); + } ; yield_statement @@ -6003,7 +6039,7 @@ from_clause ; query_body - : opt_query_body_clauses select_or_group_clause opt_query_continuation + : query_body_clauses select_or_group_clause opt_query_continuation { Linq.AQueryClause head = (Linq.AQueryClause)$2; @@ -6018,7 +6054,24 @@ query_body $$ = head; } - | opt_query_body_clauses COMPLETE_COMPLETION + | select_or_group_clause opt_query_continuation + { + Linq.AQueryClause head = (Linq.AQueryClause)$2; + + if ($1 != null) { + Linq.AQueryClause clause = (Linq.AQueryClause)$1; + clause.Tail.Next = head; + head = clause; + } + + $$ = head; + } + | query_body_clauses COMPLETE_COMPLETION + | query_body_clauses error + { + report.Error (742, GetLocation ($2), "Unexpected symbol `{0}'. A query body must end with select or group clause", GetSymbolName (yyToken)); + $$ = $1; + } | error { Error_SyntaxError (yyToken); @@ -6063,11 +6116,6 @@ select_or_group_clause } ; -opt_query_body_clauses - : /* empty */ - | query_body_clauses - ; - query_body_clauses : query_body_clause | query_body_clauses query_body_clause @@ -6773,10 +6821,10 @@ public void parse () report.Error (-25, lexer.Location, "Parsing error"); } else { // Used by compiler-tester to test internal errors - if (yacc_verbose_flag > 0) + if (yacc_verbose_flag > 0 || e is FatalException) throw; - report.Error (589, lexer.Location, "Internal compiler error during parsing"); + report.Error (589, lexer.Location, "Internal compiler error during parsing" + e); } } } diff --git a/src/Libraries/NRefactory/ICSharpCode.NRefactory.CSharp/Parser/mcs/cs-tokenizer.cs b/src/Libraries/NRefactory/ICSharpCode.NRefactory.CSharp/Parser/mcs/cs-tokenizer.cs index 0b7db95c62..35705d56e1 100644 --- a/src/Libraries/NRefactory/ICSharpCode.NRefactory.CSharp/Parser/mcs/cs-tokenizer.cs +++ b/src/Libraries/NRefactory/ICSharpCode.NRefactory.CSharp/Parser/mcs/cs-tokenizer.cs @@ -137,6 +137,11 @@ namespace Mono.CSharp pos = 0; } + public override string ToString () + { + return string.Format ("Token '{0}' at {1},{2}", Value, row, column); + } + public Location Location { get { return new Location (row, column); } } @@ -1266,10 +1271,24 @@ namespace Mono.CSharp int ntoken; int interrs = 1; int colons = 0; + int braces = 0; // // All shorcuts failed, do it hard way // while ((ntoken = xtoken ()) != Token.EOF) { + if (ntoken == Token.OPEN_BRACE) { + ++braces; + continue; + } + + if (ntoken == Token.CLOSE_BRACE) { + --braces; + continue; + } + + if (braces != 0) + continue; + if (ntoken == Token.SEMICOLON) break; @@ -1285,7 +1304,7 @@ namespace Mono.CSharp } } - next_token = colons != interrs ? Token.INTERR_NULLABLE : Token.INTERR; + next_token = colons != interrs && braces == 0 ? Token.INTERR_NULLABLE : Token.INTERR; break; } } @@ -1535,6 +1554,7 @@ namespace Mono.CSharp #endif number_pos = 0; var loc = Location; + bool hasLeadingDot = c == '.'; if (c >= '0' && c <= '9'){ if (c == '0'){ diff --git a/src/Libraries/NRefactory/ICSharpCode.NRefactory.CSharp/Parser/mcs/decl.cs b/src/Libraries/NRefactory/ICSharpCode.NRefactory.CSharp/Parser/mcs/decl.cs index 0f4a01e26c..2d2dcf8ff2 100644 --- a/src/Libraries/NRefactory/ICSharpCode.NRefactory.CSharp/Parser/mcs/decl.cs +++ b/src/Libraries/NRefactory/ICSharpCode.NRefactory.CSharp/Parser/mcs/decl.cs @@ -299,7 +299,8 @@ namespace Mono.CSharp { PartialDefinitionExists = 1 << 14, // Set when corresponding partial method definition exists HasStructLayout = 1 << 15, // Has StructLayoutAttribute HasInstanceConstructor = 1 << 16, - HasUserOperators = 1 << 17 + HasUserOperators = 1 << 17, + CanBeReused = 1 << 18 } /// @@ -425,6 +426,15 @@ namespace Mono.CSharp { VerifyClsCompliance (); } + public bool IsAvailableForReuse { + get { + return (caching_flags & Flags.CanBeReused) != 0; + } + set { + caching_flags = value ? (caching_flags | Flags.CanBeReused) : (caching_flags & ~Flags.CanBeReused); + } + } + public bool IsCompilerGenerated { get { if ((mod_flags & Modifiers.COMPILER_GENERATED) != 0) @@ -810,6 +820,11 @@ namespace Mono.CSharp { Report.Warning (3008, 1, MemberName.Location, "Identifier `{0}' is not CLS-compliant", GetSignatureForError ()); } + public virtual string GetCallerMemberName () + { + return MemberName.Name; + } + // // Returns a string that represents the signature for this // member which should be used in XML documentation. diff --git a/src/Libraries/NRefactory/ICSharpCode.NRefactory.CSharp/Parser/mcs/delegate.cs b/src/Libraries/NRefactory/ICSharpCode.NRefactory.CSharp/Parser/mcs/delegate.cs index 96dcf77415..f0781401bb 100644 --- a/src/Libraries/NRefactory/ICSharpCode.NRefactory.CSharp/Parser/mcs/delegate.cs +++ b/src/Libraries/NRefactory/ICSharpCode.NRefactory.CSharp/Parser/mcs/delegate.cs @@ -220,7 +220,7 @@ namespace Mono.CSharp { var p = parameters[i]; compiled[i] = new Parameter (new TypeExpression (parameters.Types[i], Location), p.Name, - p.ModFlags & (Parameter.Modifier.REF | Parameter.Modifier.OUT), + p.ModFlags & Parameter.Modifier.RefOutMask, p.OptAttributes == null ? null : p.OptAttributes.Clone (), Location); } @@ -255,7 +255,7 @@ namespace Mono.CSharp { int out_params = 0; foreach (Parameter p in Parameters.FixedParameters) { - if ((p.ModFlags & Parameter.Modifier.ISBYREF) != 0) + if ((p.ModFlags & Parameter.Modifier.RefOutMask) != 0) ++out_params; } @@ -265,12 +265,12 @@ namespace Mono.CSharp { int param = 0; for (int i = 0; i < Parameters.FixedParameters.Length; ++i) { Parameter p = parameters [i]; - if ((p.ModFlags & Parameter.Modifier.ISBYREF) == 0) + if ((p.ModFlags & Parameter.Modifier.RefOutMask) == 0) continue; end_params [param++] = new Parameter (new TypeExpression (p.Type, Location), p.Name, - p.ModFlags & (Parameter.Modifier.REF | Parameter.Modifier.OUT), + p.ModFlags & Parameter.Modifier.RefOutMask, p.OptAttributes == null ? null : p.OptAttributes.Clone (), Location); } diff --git a/src/Libraries/NRefactory/ICSharpCode.NRefactory.CSharp/Parser/mcs/doc.cs b/src/Libraries/NRefactory/ICSharpCode.NRefactory.CSharp/Parser/mcs/doc.cs index 369bbc5a31..e988178c43 100644 --- a/src/Libraries/NRefactory/ICSharpCode.NRefactory.CSharp/Parser/mcs/doc.cs +++ b/src/Libraries/NRefactory/ICSharpCode.NRefactory.CSharp/Parser/mcs/doc.cs @@ -397,10 +397,15 @@ namespace Mono.CSharp if (ParsedParameters != null) { var old_printer = mc.Module.Compiler.Report.SetPrinter (new NullReportPrinter ()); - foreach (var pp in ParsedParameters) { - pp.Resolve (mc); + try { + var context = new DocumentationMemberContext (mc, ParsedName ?? MemberName.Null); + + foreach (var pp in ParsedParameters) { + pp.Resolve (context); + } + } finally { + mc.Module.Compiler.Report.SetPrinter (old_printer); } - mc.Module.Compiler.Report.SetPrinter (old_printer); } if (type != null) { @@ -433,13 +438,15 @@ namespace Mono.CSharp if (m.Kind == MemberKind.Operator && !ParsedOperator.HasValue) continue; + var pm_params = pm.Parameters; + int i; for (i = 0; i < parsed_param_count; ++i) { var pparam = ParsedParameters[i]; - if (i >= pm.Parameters.Count || pparam == null || - pparam.TypeSpec != pm.Parameters.Types[i] || - (pparam.Modifier & Parameter.Modifier.SignatureMask) != (pm.Parameters.FixedParameters[i].ModFlags & Parameter.Modifier.SignatureMask)) { + if (i >= pm_params.Count || pparam == null || pparam.TypeSpec == null || + !TypeSpecComparer.Override.IsEqual (pparam.TypeSpec, pm_params.Types[i]) || + (pparam.Modifier & Parameter.Modifier.RefOutMask) != (pm_params.FixedParameters[i].ModFlags & Parameter.Modifier.RefOutMask)) { if (i > parameters_match) { parameters_match = i; @@ -459,7 +466,7 @@ namespace Mono.CSharp continue; } } else { - if (parsed_param_count != pm.Parameters.Count) + if (parsed_param_count != pm_params.Count) continue; } } @@ -612,6 +619,97 @@ namespace Mono.CSharp } } + // + // Type lookup of documentation references uses context of type where + // the reference is used but type parameters from cref value + // + sealed class DocumentationMemberContext : IMemberContext + { + readonly MemberCore host; + MemberName contextName; + + public DocumentationMemberContext (MemberCore host, MemberName contextName) + { + this.host = host; + this.contextName = contextName; + } + + public TypeSpec CurrentType { + get { + return host.CurrentType; + } + } + + public TypeParameters CurrentTypeParameters { + get { + return contextName.TypeParameters; + } + } + + public MemberCore CurrentMemberDefinition { + get { + return host.CurrentMemberDefinition; + } + } + + public bool IsObsolete { + get { + return false; + } + } + + public bool IsUnsafe { + get { + return host.IsStatic; + } + } + + public bool IsStatic { + get { + return host.IsStatic; + } + } + + public ModuleContainer Module { + get { + return host.Module; + } + } + + public string GetSignatureForError () + { + return host.GetSignatureForError (); + } + + public ExtensionMethodCandidates LookupExtensionMethod (TypeSpec extensionType, string name, int arity) + { + return null; + } + + public FullNamedExpression LookupNamespaceOrType (string name, int arity, LookupMode mode, Location loc) + { + if (arity == 0) { + var tp = CurrentTypeParameters; + if (tp != null) { + for (int i = 0; i < tp.Count; ++i) { + var t = tp[i]; + if (t.Name == name) { + t.Type.DeclaredPosition = i; + return new TypeParameterExpr (t, loc); + } + } + } + } + + return host.Parent.LookupNamespaceOrType (name, arity, mode, loc); + } + + public FullNamedExpression LookupNamespaceAlias (string name) + { + throw new NotImplementedException (); + } + } + class DocumentationParameter { public readonly Parameter.Modifier Modifier; diff --git a/src/Libraries/NRefactory/ICSharpCode.NRefactory.CSharp/Parser/mcs/driver.cs b/src/Libraries/NRefactory/ICSharpCode.NRefactory.CSharp/Parser/mcs/driver.cs index bcbf7c148f..e86263da6c 100644 --- a/src/Libraries/NRefactory/ICSharpCode.NRefactory.CSharp/Parser/mcs/driver.cs +++ b/src/Libraries/NRefactory/ICSharpCode.NRefactory.CSharp/Parser/mcs/driver.cs @@ -259,6 +259,12 @@ namespace Mono.CSharp output_file = output_file_name; } else { output_file_name = Path.GetFileName (output_file); + + if (string.IsNullOrEmpty (Path.GetFileNameWithoutExtension (output_file_name)) || + output_file_name.IndexOfAny (Path.GetInvalidFileNameChars ()) >= 0) { + Report.Error (2021, "Output file name is not valid"); + return false; + } } #if STATIC diff --git a/src/Libraries/NRefactory/ICSharpCode.NRefactory.CSharp/Parser/mcs/dynamic.cs b/src/Libraries/NRefactory/ICSharpCode.NRefactory.CSharp/Parser/mcs/dynamic.cs index 1a0288e960..c9cea6927c 100644 --- a/src/Libraries/NRefactory/ICSharpCode.NRefactory.CSharp/Parser/mcs/dynamic.cs +++ b/src/Libraries/NRefactory/ICSharpCode.NRefactory.CSharp/Parser/mcs/dynamic.cs @@ -949,7 +949,7 @@ namespace Mono.CSharp sealed class DynamicSiteClass : HoistedStoreyClass { public DynamicSiteClass (TypeDefinition parent, MemberBase host, TypeParameters tparams) - : base (parent, MakeMemberName (host, "DynamicSite", parent.DynamicSitesCounter, tparams, Location.Null), tparams, Modifiers.STATIC) + : base (parent, MakeMemberName (host, "DynamicSite", parent.DynamicSitesCounter, tparams, Location.Null), tparams, Modifiers.STATIC, MemberKind.Class) { parent.DynamicSitesCounter++; } diff --git a/src/Libraries/NRefactory/ICSharpCode.NRefactory.CSharp/Parser/mcs/ecore.cs b/src/Libraries/NRefactory/ICSharpCode.NRefactory.CSharp/Parser/mcs/ecore.cs index 9931ecbb8c..4ccc3c3e92 100644 --- a/src/Libraries/NRefactory/ICSharpCode.NRefactory.CSharp/Parser/mcs/ecore.cs +++ b/src/Libraries/NRefactory/ICSharpCode.NRefactory.CSharp/Parser/mcs/ecore.cs @@ -118,6 +118,11 @@ namespace Mono.CSharp { bool IsFixed { get; } } + public interface IExpressionCleanup + { + void EmitCleanup (EmitContext ec); + } + /// /// Base class for expressions /// @@ -222,8 +227,7 @@ namespace Mono.CSharp { public static void Error_InvalidExpressionStatement (Report Report, Location loc) { - Report.Error (201, loc, "Only assignment, call, increment, decrement, and new object " + - "expressions can be used as a statement"); + Report.Error (201, loc, "Only assignment, call, increment, decrement, await, and new object expressions can be used as a statement"); } public void Error_InvalidExpressionStatement (BlockContext ec) @@ -236,7 +240,7 @@ namespace Mono.CSharp { Report.Error (1547, loc, "Keyword `void' cannot be used in this context"); } - public virtual void Error_ValueCannotBeConverted (ResolveContext ec, Location loc, TypeSpec target, bool expl) + public virtual void Error_ValueCannotBeConverted (ResolveContext ec, TypeSpec target, bool expl) { Error_ValueCannotBeConvertedCore (ec, loc, target, expl); } @@ -316,7 +320,7 @@ namespace Mono.CSharp { TypeManager.CSharpName (type), name); } - public void Error_ValueAssignment (ResolveContext rc, Expression rhs) + public virtual void Error_ValueAssignment (ResolveContext rc, Expression rhs) { if (rhs == EmptyExpression.LValueMemberAccess || rhs == EmptyExpression.LValueMemberOutAccess) { rc.Report.SymbolRelatedToPreviousError (type); @@ -536,38 +540,40 @@ namespace Mono.CSharp { ec.EmitThis (); // Emit original code - EmitToFieldSource (ec); - - // - // Store the result to temporary field when we - // cannot load `this' directly - // - var field = ec.GetTemporaryField (type); - if (needs_temporary) { + var field = EmitToFieldSource (ec); + if (field == null) { // - // Create temporary local (we cannot load `this' before Emit) + // Store the result to temporary field when we + // cannot load `this' directly // - var temp = ec.GetTemporaryLocal (type); - ec.Emit (OpCodes.Stloc, temp); + field = ec.GetTemporaryField (type); + if (needs_temporary) { + // + // Create temporary local (we cannot load `this' before Emit) + // + var temp = ec.GetTemporaryLocal (type); + ec.Emit (OpCodes.Stloc, temp); - ec.EmitThis (); - ec.Emit (OpCodes.Ldloc, temp); - field.EmitAssignFromStack (ec); + ec.EmitThis (); + ec.Emit (OpCodes.Ldloc, temp); + field.EmitAssignFromStack (ec); - ec.FreeTemporaryLocal (temp, type); - } else { - field.EmitAssignFromStack (ec); + ec.FreeTemporaryLocal (temp, type); + } else { + field.EmitAssignFromStack (ec); + } } return field; } - protected virtual void EmitToFieldSource (EmitContext ec) + protected virtual FieldExpr EmitToFieldSource (EmitContext ec) { // // Default implementation calls Emit method // Emit (ec); + return null; } protected static void EmitExpressionsList (EmitContext ec, List expressions) @@ -909,7 +915,7 @@ namespace Mono.CSharp { converted = Convert.ImplicitConversion (ec, source, btypes.ULong, source.loc); if (converted == null) { - source.Error_ValueCannotBeConverted (ec, source.loc, btypes.Int, false); + source.Error_ValueCannotBeConverted (ec, btypes.Int, false); return null; } } @@ -1025,6 +1031,12 @@ namespace Mono.CSharp { if (es == null) Error_InvalidExpressionStatement (ec); + if (ec.CurrentAnonymousMethod is AsyncInitializer && !(e is Assign) && + (e.Type.IsGenericTask || e.Type == ec.Module.PredefinedTypes.Task.TypeSpec)) { + ec.Report.Warning (4014, 1, e.Location, + "The statement is not awaited and execution of current method continues before the call is completed. Consider using `await' operator"); + } + return es; } @@ -1926,6 +1938,12 @@ namespace Mono.CSharp { #region Properties + public override bool IsSideEffectFree { + get { + return expr.IsSideEffectFree; + } + } + public Expression OriginalExpression { get { return orig_expr; @@ -1998,6 +2016,11 @@ namespace Mono.CSharp { expr.Emit (ec); } + public override Expression EmitToField (EmitContext ec) + { + return expr.EmitToField(ec); + } + public override void EmitBranchable (EmitContext ec, Label target, bool on_true) { expr.EmitBranchable (ec, target, on_true); @@ -2473,6 +2496,12 @@ namespace Mono.CSharp { ErrorIsInaccesible (rc, e.GetSignatureForError (), loc); return e; } + } else { + var me = MemberLookup (rc, false, rc.CurrentType, Name, Arity, restrictions & ~MemberLookupRestrictions.InvocableOnly, loc) as MemberExpr; + if (me != null) { + me.Error_UnexpectedKind (rc, me, "method group", me.KindName, loc); + return ErrorExpression.Instance; + } } e = rc.LookupNamespaceOrType (Name, -System.Math.Max (1, Arity), LookupMode.Probing, loc); @@ -3330,7 +3359,7 @@ namespace Mono.CSharp { call.Emit (ec, best_candidate, arguments, loc); } - public override void Error_ValueCannotBeConverted (ResolveContext ec, Location loc, TypeSpec target, bool expl) + public override void Error_ValueCannotBeConverted (ResolveContext ec, TypeSpec target, bool expl) { ec.Report.Error (428, loc, "Cannot convert method group `{0}' to non-delegate type `{1}'. Consider using parentheses to invoke the method", Name, TypeManager.CSharpName (target)); @@ -4031,10 +4060,15 @@ namespace Mono.CSharp { Arguments orig_args = arguments; if (arg_count != param_count) { - for (int i = 0; i < pd.Count; ++i) { - if (pd.FixedParameters[i].HasDefaultValue) { - optional_count = pd.Count - i; - break; + // + // No arguments expansion when doing exact match for delegates + // + if ((restrictions & Restrictions.CovariantDelegate) == 0) { + for (int i = 0; i < pd.Count; ++i) { + if (pd.FixedParameters[i].HasDefaultValue) { + optional_count = pd.Count - i; + break; + } } } @@ -4210,7 +4244,8 @@ namespace Mono.CSharp { for (int i = 0; i < arg_count; i++) { Argument a = arguments[i]; if (a == null) { - if (!pd.FixedParameters[i].HasDefaultValue) { + var fp = pd.FixedParameters[i]; + if (!fp.HasDefaultValue) { arguments = orig_args; return arg_count * 2 + 2; } @@ -4219,7 +4254,7 @@ namespace Mono.CSharp { // Get the default value expression, we can use the same expression // if the type matches // - Expression e = pd.FixedParameters[i].DefaultValue; + Expression e = fp.DefaultValue; if (!(e is Constant) || e.Type.IsGenericOrParentIsGeneric || e.Type.IsGenericParameter) { // // LAMESPEC: No idea what the exact rules are for System.Reflection.Missing.Value instead of null @@ -4234,6 +4269,19 @@ namespace Mono.CSharp { e = e.Resolve (ec); } + if ((fp.ModFlags & Parameter.Modifier.CallerMask) != 0) { + // + // LAMESPEC: Attributes can be mixed together with build-in priority + // + if ((fp.ModFlags & Parameter.Modifier.CallerLineNumber) != 0) { + e = new IntLiteral (ec.BuiltinTypes, loc.Row, loc); + } else if ((fp.ModFlags & Parameter.Modifier.CallerFilePath) != 0) { + e = new StringLiteral (ec.BuiltinTypes, loc.NameFullPath, loc); + } else if (ec.MemberContext.CurrentMemberDefinition != null) { + e = new StringLiteral (ec.BuiltinTypes, ec.MemberContext.CurrentMemberDefinition.GetCallerMemberName (), loc); + } + } + arguments[i] = new Argument (e, Argument.AType.Default); continue; } @@ -4264,7 +4312,7 @@ namespace Mono.CSharp { continue; } } else { - score = IsArgumentCompatible (ec, a, p_mod & ~Parameter.Modifier.PARAMS, pt); + score = IsArgumentCompatible (ec, a, p_mod, pt); if (score < 0) dynamicArgument = true; @@ -4325,7 +4373,7 @@ namespace Mono.CSharp { // Types have to be identical when ref or out modifer // is used and argument is not of dynamic type // - if ((argument.Modifier | param_mod) != 0) { + if (((argument.Modifier | param_mod) & Parameter.Modifier.RefOutMask) != 0) { if (argument.Type != parameter) { // // Do full equality check after quick path @@ -4334,18 +4382,18 @@ namespace Mono.CSharp { // // Using dynamic for ref/out parameter can still succeed at runtime // - if (argument.Type.BuiltinType == BuiltinTypeSpec.Type.Dynamic && argument.Modifier == 0 && (restrictions & Restrictions.CovariantDelegate) == 0) + if (argument.Type.BuiltinType == BuiltinTypeSpec.Type.Dynamic && (argument.Modifier & Parameter.Modifier.RefOutMask) == 0 && (restrictions & Restrictions.CovariantDelegate) == 0) return -1; return 2; } } - if (argument.Modifier != param_mod) { + if ((argument.Modifier & Parameter.Modifier.RefOutMask) != (param_mod & Parameter.Modifier.RefOutMask)) { // // Using dynamic for ref/out parameter can still succeed at runtime // - if (argument.Type.BuiltinType == BuiltinTypeSpec.Type.Dynamic && argument.Modifier == 0 && (restrictions & Restrictions.CovariantDelegate) == 0) + if (argument.Type.BuiltinType == BuiltinTypeSpec.Type.Dynamic && (argument.Modifier & Parameter.Modifier.RefOutMask) == 0 && (restrictions & Restrictions.CovariantDelegate) == 0) return -1; return 1; @@ -4718,9 +4766,12 @@ namespace Mono.CSharp { if (custom_errors != null && custom_errors.ArgumentMismatch (ec, method, a, idx)) return; + if (a.Type == InternalType.ErrorType) + return; + if (a is CollectionElementInitializer.ElementInitializerArgument) { ec.Report.SymbolRelatedToPreviousError (method); - if ((expected_par.FixedParameters[idx].ModFlags & Parameter.Modifier.ISBYREF) != 0) { + if ((expected_par.FixedParameters[idx].ModFlags & Parameter.Modifier.RefOutMask) != 0) { ec.Report.Error (1954, loc, "The best overloaded collection initalizer method `{0}' cannot have 'ref', or `out' modifier", TypeManager.CSharpSignature (method)); return; @@ -4730,7 +4781,7 @@ namespace Mono.CSharp { } else if (IsDelegateInvoke) { ec.Report.Error (1594, loc, "Delegate `{0}' has some invalid arguments", DelegateType.GetSignatureForError ()); - } else if (a.Type != InternalType.ErrorType) { + } else { ec.Report.SymbolRelatedToPreviousError (method); ec.Report.Error (1502, loc, "The best overloaded method match for `{0}' has some invalid arguments", method.GetSignatureForError ()); @@ -4739,15 +4790,14 @@ namespace Mono.CSharp { Parameter.Modifier mod = idx >= expected_par.Count ? 0 : expected_par.FixedParameters[idx].ModFlags; string index = (idx + 1).ToString (); - if (((mod & (Parameter.Modifier.REF | Parameter.Modifier.OUT)) ^ - (a.Modifier & (Parameter.Modifier.REF | Parameter.Modifier.OUT))) != 0) { - if ((mod & Parameter.Modifier.ISBYREF) == 0) + if (((mod & Parameter.Modifier.RefOutMask) ^ (a.Modifier & Parameter.Modifier.RefOutMask)) != 0) { + if ((mod & Parameter.Modifier.RefOutMask) == 0) ec.Report.Error (1615, loc, "Argument `#{0}' does not require `{1}' modifier. Consider removing `{1}' modifier", index, Parameter.GetModifierSignature (a.Modifier)); else ec.Report.Error (1620, loc, "Argument `#{0}' is missing `{1}' modifier", index, Parameter.GetModifierSignature (mod)); - } else if (a.Type != InternalType.ErrorType) { + } else { string p1 = a.GetSignatureForError (); string p2 = TypeManager.CSharpName (paramType); @@ -4876,8 +4926,8 @@ namespace Mono.CSharp { // // Types have to be identical when ref or out modifer is used // - if (a.Modifier != 0 || (p_mod & ~Parameter.Modifier.PARAMS) != 0) { - if ((p_mod & ~Parameter.Modifier.PARAMS) != a.Modifier) + if (((a.Modifier | p_mod) & Parameter.Modifier.RefOutMask) != 0) { + if ((a.Modifier & Parameter.Modifier.RefOutMask) != (p_mod & Parameter.Modifier.RefOutMask)) break; if (a.Expr.Type == pt || TypeSpecComparer.IsEqual (a.Expr.Type, pt)) @@ -5515,7 +5565,7 @@ namespace Mono.CSharp { base.EmitSideEffect (ec); } - public void AddressOf (EmitContext ec, AddressOp mode) + public virtual void AddressOf (EmitContext ec, AddressOp mode) { if ((mode & AddressOp.Store) != 0) spec.MemberDefinition.SetIsAssigned (); @@ -5942,10 +5992,11 @@ namespace Mono.CSharp { Emit (ec, false); } - protected override void EmitToFieldSource (EmitContext ec) + protected override FieldExpr EmitToFieldSource (EmitContext ec) { has_await_arguments = true; Emit (ec, false); + return null; } public abstract SLE.Expression MakeAssignExpression (BuilderContext ctx, Expression source); @@ -6249,9 +6300,10 @@ namespace Mono.CSharp { // // Don't capture temporary variables except when using - // state machine redirection + // state machine redirection and block yields // - if (ec.CurrentAnonymousMethod != null && ec.CurrentAnonymousMethod is StateMachineInitializer && ec.IsVariableCapturingRequired) { + if (ec.CurrentAnonymousMethod != null && ec.CurrentAnonymousMethod.IsIterator && + ec.CurrentBlock.Explicit.HasYield && ec.IsVariableCapturingRequired) { AnonymousMethodStorey storey = li.Block.Explicit.CreateAnonymousMethodStorey (ec); storey.CaptureLocalVariable (ec, li); } diff --git a/src/Libraries/NRefactory/ICSharpCode.NRefactory.CSharp/Parser/mcs/enum.cs b/src/Libraries/NRefactory/ICSharpCode.NRefactory.CSharp/Parser/mcs/enum.cs index 0748486c30..126d2de867 100644 --- a/src/Libraries/NRefactory/ICSharpCode.NRefactory.CSharp/Parser/mcs/enum.cs +++ b/src/Libraries/NRefactory/ICSharpCode.NRefactory.CSharp/Parser/mcs/enum.cs @@ -162,9 +162,9 @@ namespace Mono.CSharp { Modifiers.INTERNAL | Modifiers.PRIVATE; - readonly TypeExpr underlying_type_expr; + readonly FullNamedExpression underlying_type_expr; - public Enum (TypeContainer parent, TypeExpression type, Modifiers mod_flags, MemberName name, Attributes attrs) + public Enum (TypeContainer parent, FullNamedExpression type, Modifiers mod_flags, MemberName name, Attributes attrs) : base (parent, name, attrs, MemberKind.Enum) { underlying_type_expr = type; @@ -181,7 +181,7 @@ namespace Mono.CSharp { } } - public TypeExpr BaseTypeExpression { + public FullNamedExpression BaseTypeExpression { get { return underlying_type_expr; } diff --git a/src/Libraries/NRefactory/ICSharpCode.NRefactory.CSharp/Parser/mcs/expression.cs b/src/Libraries/NRefactory/ICSharpCode.NRefactory.CSharp/Parser/mcs/expression.cs index 4ad2473d69..3091426b4e 100644 --- a/src/Libraries/NRefactory/ICSharpCode.NRefactory.CSharp/Parser/mcs/expression.cs +++ b/src/Libraries/NRefactory/ICSharpCode.NRefactory.CSharp/Parser/mcs/expression.cs @@ -103,7 +103,12 @@ namespace Mono.CSharp protected override Expression DoResolve (ResolveContext ec) { - return expr.Resolve (ec); + var res = expr.Resolve (ec); + var constant = res as Constant; + if (constant != null && constant.IsLiteral) + return Constant.CreateConstantFromValue (res.Type, constant.GetValue (), expr.Location); + + return res; } public override Expression DoResolveLValue (ResolveContext ec, Expression right_side) @@ -142,10 +147,12 @@ namespace Mono.CSharp // This routine will attempt to simplify the unary expression when the // argument is a constant. // - Constant TryReduceConstant (ResolveContext ec, Constant e) + Constant TryReduceConstant (ResolveContext ec, Constant constant) { - if (e is EmptyConstantCast) - return TryReduceConstant (ec, ((EmptyConstantCast) e).child); + var e = constant; + + while (e is EmptyConstantCast) + e = ((EmptyConstantCast) e).child; if (e is SideEffectConstant) { Constant r = TryReduceConstant (ec, ((SideEffectConstant) e).value); @@ -220,7 +227,7 @@ namespace Mono.CSharp return new LongConstant (ec.BuiltinTypes, -lvalue, e.Location); case BuiltinTypeSpec.Type.UInt: - UIntLiteral uil = e as UIntLiteral; + UIntLiteral uil = constant as UIntLiteral; if (uil != null) { if (uil.Value == int.MaxValue + (uint) 1) return new IntLiteral (ec.BuiltinTypes, int.MinValue, e.Location); @@ -230,13 +237,13 @@ namespace Mono.CSharp case BuiltinTypeSpec.Type.ULong: - ULongLiteral ull = e as ULongLiteral; + ULongLiteral ull = constant as ULongLiteral; if (ull != null && ull.Value == 9223372036854775808) return new LongLiteral (ec.BuiltinTypes, long.MinValue, e.Location); return null; case BuiltinTypeSpec.Type.Float: - FloatLiteral fl = e as FloatLiteral; + FloatLiteral fl = constant as FloatLiteral; // For better error reporting if (fl != null) return new FloatLiteral (ec.BuiltinTypes, -fl.Value, e.Location); @@ -244,7 +251,7 @@ namespace Mono.CSharp return new FloatConstant (ec.BuiltinTypes, -((FloatConstant) e).Value, e.Location); case BuiltinTypeSpec.Type.Double: - DoubleLiteral dl = e as DoubleLiteral; + DoubleLiteral dl = constant as DoubleLiteral; // For better error reporting if (dl != null) return new DoubleLiteral (ec.BuiltinTypes, -dl.Value, e.Location); @@ -1687,19 +1694,19 @@ namespace Mono.CSharp return null; } - eclass = ExprClass.Value; + if (type.IsPointer && !ec.IsUnsafe) { + UnsafeError (ec, loc); + } + eclass = ExprClass.Value; + Constant c = expr as Constant; if (c != null) { - c = c.TryReduce (ec, type, loc); + c = c.TryReduce (ec, type); if (c != null) return c; } - if (type.IsPointer && !ec.IsUnsafe) { - UnsafeError (ec, loc); - } - var res = Convert.ExplicitConversion (ec, expr, type, loc); if (res == expr) return EmptyCast.Create (res, type); @@ -2654,7 +2661,7 @@ namespace Mono.CSharp return left; if (left.IsZeroInteger) - return left.TryReduce (ec, right.Type, loc); + return left.TryReduce (ec, right.Type); break; @@ -3929,6 +3936,27 @@ namespace Mono.CSharp } } + public override Expression EmitToField (EmitContext ec) + { + if ((oper & Operator.LogicalMask) == 0) { + var await_expr = left as Await; + if (await_expr != null && right.IsSideEffectFree) { + await_expr.Statement.EmitPrologue (ec); + left = await_expr.Statement.GetResultExpression (ec); + return this; + } + + await_expr = right as Await; + if (await_expr != null && left.IsSideEffectFree) { + await_expr.Statement.EmitPrologue (ec); + right = await_expr.Statement.GetResultExpression (ec); + return this; + } + } + + return base.EmitToField (ec); + } + protected override void CloneTo (CloneContext clonectx, Expression t) { Binary target = (Binary) t; @@ -4245,7 +4273,7 @@ namespace Mono.CSharp // bool right_contains_await = ec.HasSet (BuilderContext.Options.AsyncBody) && arguments[1].Expr.ContainsEmitWithAwait (); if (right_contains_await) { - arguments[0] = arguments[0].EmitToField (ec); + arguments[0] = arguments[0].EmitToField (ec, false); arguments[0].Expr.Emit (ec); } else { arguments[0].Expr.Emit (ec); @@ -4476,7 +4504,7 @@ namespace Mono.CSharp // converted = GetOperatorTrue (ec, expr, loc); if (converted == null) { - expr.Error_ValueCannotBeConverted (ec, loc, type, false); + expr.Error_ValueCannotBeConverted (ec, type, false); return null; } @@ -4961,22 +4989,25 @@ namespace Mono.CSharp return this; } - public override Expression DoResolveLValue (ResolveContext ec, Expression right_side) + public override Expression DoResolveLValue (ResolveContext ec, Expression rhs) { - // is out param - if (right_side == EmptyExpression.OutAccess) + // + // Don't be too pedantic when variable is used as out param or for some broken code + // which uses property/indexer access to run some initialization + // + if (rhs == EmptyExpression.OutAccess || rhs.eclass == ExprClass.PropertyAccess || rhs.eclass == ExprClass.IndexerAccess) local_info.SetIsUsed (); if (local_info.IsReadonly && !ec.HasAny (ResolveContext.Options.FieldInitializerScope | ResolveContext.Options.UsingInitializerScope)) { int code; string msg; - if (right_side == EmptyExpression.OutAccess) { + if (rhs == EmptyExpression.OutAccess) { code = 1657; msg = "Cannot pass `{0}' as a ref or out argument because it is a `{1}'"; - } else if (right_side == EmptyExpression.LValueMemberAccess) { + } else if (rhs == EmptyExpression.LValueMemberAccess) { code = 1654; msg = "Cannot assign to members of `{0}' because it is a `{1}'"; - } else if (right_side == EmptyExpression.LValueMemberOutAccess) { + } else if (rhs == EmptyExpression.LValueMemberOutAccess) { code = 1655; msg = "Cannot pass members of `{0}' as ref or out arguments because it is a `{1}'"; - } else if (right_side == EmptyExpression.UnaryAddress) { + } else if (rhs == EmptyExpression.UnaryAddress) { code = 459; msg = "Cannot take the address of {1} `{0}'"; } else { code = 1656; msg = "Cannot assign to `{0}' because it is a `{1}'"; @@ -4989,7 +5020,7 @@ namespace Mono.CSharp if (eclass == ExprClass.Unresolved) DoResolveBase (ec); - return base.DoResolveLValue (ec, right_side); + return base.DoResolveLValue (ec, rhs); } public override int GetHashCode () @@ -5052,11 +5083,11 @@ namespace Mono.CSharp } public override bool IsRef { - get { return (pi.Parameter.ModFlags & Parameter.Modifier.ISBYREF) != 0; } + get { return (pi.Parameter.ModFlags & Parameter.Modifier.RefOutMask) != 0; } } bool HasOutModifier { - get { return pi.Parameter.ModFlags == Parameter.Modifier.OUT; } + get { return (pi.Parameter.ModFlags & Parameter.Modifier.OUT) != 0; } } public override HoistedVariable GetHoistedVariable (AnonymousExpression ae) @@ -5138,7 +5169,7 @@ namespace Mono.CSharp if (ec.IsVariableCapturingRequired && !pi.Block.ParametersBlock.IsExpressionTree) { AnonymousMethodStorey storey = pi.Block.Explicit.CreateAnonymousMethodStorey (ec); - storey.CaptureParameter (ec, this); + storey.CaptureParameter (ec, pi, this); } } @@ -5249,6 +5280,12 @@ namespace Mono.CSharp return expr; } } + + public MethodGroupExpr MethodGroup { + get { + return mg; + } + } #endregion protected override void CloneTo (CloneContext clonectx, Expression t) @@ -6627,6 +6664,11 @@ namespace Mono.CSharp } public override void Emit (EmitContext ec) + { + EmitToFieldSource (ec); + } + + protected sealed override FieldExpr EmitToFieldSource (EmitContext ec) { if (first_emit != null) { first_emit.Emit (ec); @@ -6646,7 +6688,7 @@ namespace Mono.CSharp ec.EmitArrayNew ((ArrayContainer) type); if (initializers == null) - return; + return await_stack_field; if (await_stack_field != null) await_stack_field.EmitAssignFromStack (ec); @@ -6671,11 +6713,10 @@ namespace Mono.CSharp EmitDynamicInitializers (ec, true, await_stack_field); } - if (await_stack_field != null) - await_stack_field.Emit (ec); - if (first_emit_temp != null) first_emit_temp.Release (ec); + + return await_stack_field; } public override void EncodeAttributeValue (IMemberContext rc, AttributeEncoder enc, TypeSpec targetType) @@ -6974,15 +7015,7 @@ namespace Mono.CSharp return null; AnonymousMethodStorey storey = ae.Storey; - while (storey != null) { - AnonymousMethodStorey temp = storey.Parent as AnonymousMethodStorey; - if (temp == null) - return storey.HoistedThis; - - storey = temp; - } - - return null; + return storey != null ? storey.HoistedThis : null; } public static bool IsThisAvailable (ResolveContext ec, bool ignoreAnonymous) @@ -7011,11 +7044,20 @@ namespace Mono.CSharp var block = ec.CurrentBlock; if (block != null) { - if (block.ParametersBlock.TopBlock.ThisVariable != null) - variable_info = block.ParametersBlock.TopBlock.ThisVariable.VariableInfo; + var top = block.ParametersBlock.TopBlock; + if (top.ThisVariable != null) + variable_info = top.ThisVariable.VariableInfo; AnonymousExpression am = ec.CurrentAnonymousMethod; - if (am != null && ec.IsVariableCapturingRequired) { + if (am != null && ec.IsVariableCapturingRequired && !block.Explicit.HasCapturedThis) { + // + // Hoisted this is almost like hoisted variable but not exactly. When + // there is no variable hoisted we can simply emit an instance method + // without lifting this into a storey. Unfotunatelly this complicates + // this in other cases because we don't know where this will be hoisted + // until top-level block is fully resolved + // + top.AddThisReferenceFromChildrenBlock (block.Explicit); am.SetHasThisAccess (); } } @@ -9248,11 +9290,15 @@ namespace Mono.CSharp return this; } + public override void Error_ValueAssignment (ResolveContext rc, Expression rhs) + { + } + public override void Error_UnexpectedKind (ResolveContext ec, ResolveFlags flags, Location loc) { } - public override void Error_ValueCannotBeConverted (ResolveContext ec, Location loc, TypeSpec target, bool expl) + public override void Error_ValueCannotBeConverted (ResolveContext ec, TypeSpec target, bool expl) { } diff --git a/src/Libraries/NRefactory/ICSharpCode.NRefactory.CSharp/Parser/mcs/field.cs b/src/Libraries/NRefactory/ICSharpCode.NRefactory.CSharp/Parser/mcs/field.cs index 6d932bf81f..d38ecc945a 100644 --- a/src/Libraries/NRefactory/ICSharpCode.NRefactory.CSharp/Parser/mcs/field.cs +++ b/src/Libraries/NRefactory/ICSharpCode.NRefactory.CSharp/Parser/mcs/field.cs @@ -232,7 +232,7 @@ namespace Mono.CSharp { if (member_type.BuiltinType == BuiltinTypeSpec.Type.Dynamic) { Module.PredefinedAttributes.Dynamic.EmitAttribute (FieldBuilder); - } else if (!(Parent is CompilerGeneratedClass) && member_type.HasDynamicElement) { + } else if (!Parent.IsCompilerGenerated && member_type.HasDynamicElement) { Module.PredefinedAttributes.Dynamic.EmitAttribute (FieldBuilder, member_type, Location); } diff --git a/src/Libraries/NRefactory/ICSharpCode.NRefactory.CSharp/Parser/mcs/iterators.cs b/src/Libraries/NRefactory/ICSharpCode.NRefactory.CSharp/Parser/mcs/iterators.cs index 6e977d4629..2586eada9d 100644 --- a/src/Libraries/NRefactory/ICSharpCode.NRefactory.CSharp/Parser/mcs/iterators.cs +++ b/src/Libraries/NRefactory/ICSharpCode.NRefactory.CSharp/Parser/mcs/iterators.cs @@ -11,10 +11,6 @@ // Copyright 2011 Xamarin Inc. // -// TODO: -// Flow analysis for Yield. -// - using System; using System.Collections.Generic; using Mono.CompilerServices.SymbolWriter; @@ -160,9 +156,10 @@ namespace Mono.CSharp Field pc_field; StateMachineMethod method; + int local_name_idx; - protected StateMachine (Block block, TypeDefinition parent, MemberBase host, TypeParameters tparams, string name) - : base (block, parent, host, tparams, name) + protected StateMachine (ParametersBlock block, TypeDefinition parent, MemberBase host, TypeParameters tparams, string name, MemberKind kind) + : base (block, parent, host, tparams, name, kind) { } @@ -197,6 +194,14 @@ namespace Mono.CSharp return base.DoDefineMembers (); } + + protected override string GetVariableMangledName (LocalVariable local_info) + { + if (local_info.IsCompilerGenerated) + return base.GetVariableMangledName (local_info); + + return "<" + local_info.Name + ">__" + local_name_idx++.ToString ("X"); + } } class IteratorStorey : StateMachine @@ -399,17 +404,13 @@ namespace Mono.CSharp TypeExpr iterator_type_expr; Field current_field; Field disposing_field; - int local_name_idx; - TypeExpr enumerator_type; - TypeExpr enumerable_type; - TypeArguments generic_args; - TypeExpr generic_enumerator_type; - TypeExpr generic_enumerable_type; + TypeSpec generic_enumerator_type; + TypeSpec generic_enumerable_type; public IteratorStorey (Iterator iterator) : base (iterator.Container.ParametersBlock, iterator.Host, - iterator.OriginalMethod as MemberBase, iterator.OriginalMethod.CurrentTypeParameters, "Iterator") + iterator.OriginalMethod as MemberBase, iterator.OriginalMethod.CurrentTypeParameters, "Iterator", MemberKind.Class) { this.Iterator = iterator; } @@ -437,33 +438,30 @@ namespace Mono.CSharp mtype = Mutator.Mutate (mtype); iterator_type_expr = new TypeExpression (mtype, Location); - generic_args = new TypeArguments (iterator_type_expr); - var list = new List (); + var ifaces = new List (5); if (Iterator.IsEnumerable) { - enumerable_type = new TypeExpression (Compiler.BuiltinTypes.IEnumerable, Location); - list.Add (enumerable_type); + ifaces.Add (Compiler.BuiltinTypes.IEnumerable); if (Module.PredefinedTypes.IEnumerableGeneric.Define ()) { - generic_enumerable_type = new GenericTypeExpr (Module.PredefinedTypes.IEnumerableGeneric.TypeSpec, generic_args, Location); - list.Add (generic_enumerable_type); + generic_enumerable_type = Module.PredefinedTypes.IEnumerableGeneric.TypeSpec.MakeGenericType (Module, new[] { mtype }); + ifaces.Add (generic_enumerable_type); } } - enumerator_type = new TypeExpression (Compiler.BuiltinTypes.IEnumerator, Location); - list.Add (enumerator_type); - - list.Add (new TypeExpression (Compiler.BuiltinTypes.IDisposable, Location)); + ifaces.Add (Compiler.BuiltinTypes.IEnumerator); + ifaces.Add (Compiler.BuiltinTypes.IDisposable); var ienumerator_generic = Module.PredefinedTypes.IEnumeratorGeneric; if (ienumerator_generic.Define ()) { - generic_enumerator_type = new GenericTypeExpr (ienumerator_generic.TypeSpec, generic_args, Location); - list.Add (generic_enumerator_type); + generic_enumerator_type = ienumerator_generic.TypeSpec.MakeGenericType (Module, new [] { mtype }); + ifaces.Add (generic_enumerator_type); } - type_bases = list; + base_class = null; - return base.ResolveBaseTypes (out base_class); + base_type = Compiler.BuiltinTypes.Object; + return ifaces.ToArray (); } protected override bool DoDefineMembers () @@ -497,20 +495,20 @@ namespace Mono.CSharp var name = new MemberName ("GetEnumerator", null, explicit_iface, Location.Null); if (generic_enumerator_type != null) { - explicit_iface = new GenericTypeExpr (Module.PredefinedTypes.IEnumerableGeneric.Resolve (), generic_args, Location); + explicit_iface = new TypeExpression (generic_enumerable_type, Location); var gname = new MemberName ("GetEnumerator", null, explicit_iface, Location.Null); - Method gget_enumerator = GetEnumeratorMethod.Create (this, generic_enumerator_type, gname); + Method gget_enumerator = GetEnumeratorMethod.Create (this, new TypeExpression (generic_enumerator_type, Location), gname); // // Just call generic GetEnumerator implementation // var stmt = new Return (new Invocation (new DynamicMethodGroupExpr (gget_enumerator, Location), null), Location); - Method get_enumerator = GetEnumeratorMethod.Create (this, enumerator_type, name, stmt); + Method get_enumerator = GetEnumeratorMethod.Create (this, new TypeExpression (Compiler.BuiltinTypes.IEnumerator, Location), name, stmt); Members.Add (get_enumerator); Members.Add (gget_enumerator); } else { - Members.Add (GetEnumeratorMethod.Create (this, enumerator_type, name)); + Members.Add (GetEnumeratorMethod.Create (this, new TypeExpression (Compiler.BuiltinTypes.IEnumerator, Location), name)); } } @@ -523,7 +521,7 @@ namespace Mono.CSharp FullNamedExpression explicit_iface; if (is_generic) { - explicit_iface = new GenericTypeExpr (Module.PredefinedTypes.IEnumeratorGeneric.Resolve (), generic_args, Location); + explicit_iface = new TypeExpression (generic_enumerator_type, Location); type = iterator_type_expr; } else { explicit_iface = new TypeExpression (Module.Compiler.BuiltinTypes.IEnumerator, Location); @@ -564,16 +562,11 @@ namespace Mono.CSharp reset.Block.AddStatement (new Throw (new New (new TypeExpression (ex_type, Location), null, Location), Location)); } - protected override void EmitHoistedParameters (EmitContext ec, IList hoisted) + protected override void EmitHoistedParameters (EmitContext ec, List hoisted) { base.EmitHoistedParameters (ec, hoisted); base.EmitHoistedParameters (ec, hoisted_params_copy); } - - protected override string GetVariableMangledName (LocalVariable local_info) - { - return "<" + local_info.Name + ">__" + local_name_idx++.ToString ("X"); - } } public class StateMachineMethod : Method @@ -705,8 +698,6 @@ namespace Mono.CSharp protected override Expression DoResolve (ResolveContext ec) { - storey = (StateMachine) block.Parent.ParametersBlock.AnonymousMethodStorey; - var ctx = CreateBlockContext (ec); Block.Resolve (ctx); @@ -733,7 +724,7 @@ namespace Mono.CSharp public override void Emit (EmitContext ec) { // - // Load Iterator storey instance + // Load state machine instance // storey.Instance.Emit (ec); } @@ -752,11 +743,7 @@ namespace Mono.CSharp iterator_body_end = ec.DefineLabel (); - if (ec.EmitAccurateDebugInfo && ec.Mark (Block.Original.StartLocation)) { - ec.Emit (OpCodes.Nop); - } - - block.Emit (ec); + block.EmitEmbedded (ec); ec.MarkLabel (iterator_body_end); @@ -819,11 +806,7 @@ namespace Mono.CSharp iterator_body_end = ec.DefineLabel (); - if (ec.EmitAccurateDebugInfo && ec.Mark (Block.Original.StartLocation)) { - ec.Emit (OpCodes.Nop); - } - - block.Emit (ec); + block.EmitEmbedded (ec); ec.MarkLabel (iterator_body_end); @@ -908,16 +891,51 @@ namespace Mono.CSharp ec.Emit (OpCodes.Stloc, skip_finally); } } + + public void SetStateMachine (StateMachine stateMachine) + { + this.storey = stateMachine; + } } // - // Iterators are implemented as hidden anonymous block + // Iterators are implemented as state machine blocks // public class Iterator : StateMachineInitializer { + sealed class TryFinallyBlockProxyStatement : Statement + { + TryFinallyBlock block; + Iterator iterator; + + public TryFinallyBlockProxyStatement (Iterator iterator, TryFinallyBlock block) + { + this.iterator = iterator; + this.block = block; + } + + protected override void CloneTo (CloneContext clonectx, Statement target) + { + throw new NotSupportedException (); + } + + protected override void DoEmit (EmitContext ec) + { + // + // Restore redirection for any captured variables + // + ec.CurrentAnonymousMethod = iterator; + + using (ec.With (BuilderContext.Options.OmitDebugInfo, !ec.HasMethodSymbolBuilder)) { + block.EmitFinallyBody (ec); + } + } + } + public readonly IMethodData OriginalMethod; public readonly bool IsEnumerable; public readonly TypeSpec OriginalIteratorType; + int finally_hosts_counter; public Iterator (ParametersBlock block, IMethodData method, TypeDefinition host, TypeSpec iterator_type, bool is_enumerable) : base (block, host, host.Compiler.BuiltinTypes.Bool) @@ -928,7 +946,9 @@ namespace Mono.CSharp this.type = method.ReturnType; } - public Block Container { + #region Properties + + public ToplevelBlock Container { get { return OriginalMethod.Block; } } @@ -940,6 +960,22 @@ namespace Mono.CSharp get { return true; } } + #endregion + + public Method CreateFinallyHost (TryFinallyBlock block) + { + var method = new Method (storey, new TypeExpression (storey.Compiler.BuiltinTypes.Void, loc), + Modifiers.COMPILER_GENERATED, new MemberName (CompilerGeneratedContainer.MakeName (null, null, "Finally", finally_hosts_counter++), loc), + ParametersCompiled.EmptyReadOnlyParameters, null); + + method.Block = new ToplevelBlock (method.Compiler, method.ParameterInfo, loc); + method.Block.IsCompilerGenerated = true; + method.Block.AddStatement (new TryFinallyBlockProxyStatement (this, block)); + + storey.AddMember (method); + return method; + } + public void EmitYieldBreak (EmitContext ec, bool unwind_protect) { ec.Emit (unwind_protect ? OpCodes.Leave : OpCodes.Br, move_next_error); @@ -975,11 +1011,13 @@ namespace Mono.CSharp public void EmitDispose (EmitContext ec) { + if (resume_points == null) + return; + Label end = ec.DefineLabel (); Label[] labels = null; - int n_resume_points = resume_points == null ? 0 : resume_points.Count; - for (int i = 0; i < n_resume_points; ++i) { + for (int i = 0; i < resume_points.Count; ++i) { ResumableStatement s = resume_points[i]; Label ret = s.PrepareForDispose (ec, end); if (ret.Equals (end) && labels == null) @@ -1069,7 +1107,7 @@ namespace Mono.CSharp for (int i = 0; i < parameters.Count; i++) { Parameter p = parameters [i]; Parameter.Modifier mod = p.ModFlags; - if ((mod & Parameter.Modifier.ISBYREF) != 0) { + if ((mod & Parameter.Modifier.RefOutMask) != 0) { parent.Compiler.Report.Error (1623, p.Location, "Iterators cannot have ref or out parameters"); return; @@ -1092,7 +1130,7 @@ namespace Mono.CSharp parent.Compiler.Report.Error (1629, method.Location, "Unsafe code may not appear in iterators"); } - method.Block.WrapIntoIterator (method, parent, iterator_type, is_enumerable); + method.Block = method.Block.ConvertToIterator (method, parent, iterator_type, is_enumerable); } static bool CheckType (TypeSpec ret, TypeContainer parent, out TypeSpec original_iterator_type, out bool is_enumerable) diff --git a/src/Libraries/NRefactory/ICSharpCode.NRefactory.CSharp/Parser/mcs/lambda.cs b/src/Libraries/NRefactory/ICSharpCode.NRefactory.CSharp/Parser/mcs/lambda.cs index f1cc07b195..d972450fc7 100644 --- a/src/Libraries/NRefactory/ICSharpCode.NRefactory.CSharp/Parser/mcs/lambda.cs +++ b/src/Libraries/NRefactory/ICSharpCode.NRefactory.CSharp/Parser/mcs/lambda.cs @@ -81,7 +81,7 @@ namespace Mono.CSharp { TypeSpec [] ptypes = new TypeSpec [Parameters.Count]; for (int i = 0; i < d_params.Count; i++) { // D has no ref or out parameters - if ((d_params.FixedParameters [i].ModFlags & Parameter.Modifier.ISBYREF) != 0) + if ((d_params.FixedParameters[i].ModFlags & Parameter.Modifier.RefOutMask) != 0) return null; TypeSpec d_param = d_params.Types [i]; @@ -191,7 +191,7 @@ namespace Mono.CSharp { return Expr.CreateExpressionTree (ec); } - public override void Emit (EmitContext ec) + protected override void DoEmit (EmitContext ec) { if (statement != null) { statement.EmitStatement (ec); @@ -203,7 +203,7 @@ namespace Mono.CSharp { return; } - base.Emit (ec); + base.DoEmit (ec); } protected override bool DoResolve (BlockContext ec) diff --git a/src/Libraries/NRefactory/ICSharpCode.NRefactory.CSharp/Parser/mcs/linq.cs b/src/Libraries/NRefactory/ICSharpCode.NRefactory.CSharp/Parser/mcs/linq.cs index 4fd1254ff1..1c93d6046f 100644 --- a/src/Libraries/NRefactory/ICSharpCode.NRefactory.CSharp/Parser/mcs/linq.cs +++ b/src/Libraries/NRefactory/ICSharpCode.NRefactory.CSharp/Parser/mcs/linq.cs @@ -90,6 +90,13 @@ namespace Mono.CSharp.Linq return rmg; } + protected override Expression DoResolveDynamic (ResolveContext ec, Expression memberExpr) + { + ec.Report.Error (1979, loc, + "Query expressions with a source or join sequence of type `dynamic' are not allowed"); + return null; + } + #region IErrorHandler Members bool OverloadResolver.IErrorHandler.AmbiguousCandidates (ResolveContext ec, MemberSpec best, MemberSpec ambiguous) @@ -422,19 +429,6 @@ namespace Mono.CSharp.Linq public override Expression BuildQueryClause (ResolveContext ec, Expression lSide, Parameter parameter) { -/* - expr = expr.Resolve (ec); - if (expr == null) - return null; - - if (expr.Type == InternalType.Dynamic || expr.Type == TypeManager.void_type) { - ec.Report.Error (1979, expr.Location, - "Query expression with a source or join sequence of type `{0}' is not allowed", - TypeManager.CSharpName (expr.Type)); - return null; - } -*/ - if (IdentifierType != null) expr = CreateCastExpression (expr); diff --git a/src/Libraries/NRefactory/ICSharpCode.NRefactory.CSharp/Parser/mcs/literal.cs b/src/Libraries/NRefactory/ICSharpCode.NRefactory.CSharp/Parser/mcs/literal.cs index bb0370914b..bdbd57a4f7 100644 --- a/src/Libraries/NRefactory/ICSharpCode.NRefactory.CSharp/Parser/mcs/literal.cs +++ b/src/Libraries/NRefactory/ICSharpCode.NRefactory.CSharp/Parser/mcs/literal.cs @@ -50,7 +50,7 @@ namespace Mono.CSharp { } - public override void Error_ValueCannotBeConverted (ResolveContext ec, Location loc, TypeSpec t, bool expl) + public override void Error_ValueCannotBeConverted (ResolveContext ec, TypeSpec t, bool expl) { if (t.IsGenericParameter) { ec.Report.Error(403, loc, @@ -65,7 +65,7 @@ namespace Mono.CSharp return; } - base.Error_ValueCannotBeConverted (ec, loc, t, expl); + base.Error_ValueCannotBeConverted (ec, t, expl); } public override string GetValueAsLiteral () @@ -253,7 +253,7 @@ namespace Mono.CSharp { } - public override void Error_ValueCannotBeConverted (ResolveContext ec, Location loc, TypeSpec target, bool expl) + public override void Error_ValueCannotBeConverted (ResolveContext ec, TypeSpec target, bool expl) { if (target.BuiltinType == BuiltinTypeSpec.Type.Float) { Error_664 (ec, loc, "float", "f"); @@ -265,7 +265,7 @@ namespace Mono.CSharp return; } - base.Error_ValueCannotBeConverted (ec, loc, target, expl); + base.Error_ValueCannotBeConverted (ec, target, expl); } static void Error_664 (ResolveContext ec, Location loc, string type, string suffix) diff --git a/src/Libraries/NRefactory/ICSharpCode.NRefactory.CSharp/Parser/mcs/membercache.cs b/src/Libraries/NRefactory/ICSharpCode.NRefactory.CSharp/Parser/mcs/membercache.cs index 009683e90d..5374da9db9 100644 --- a/src/Libraries/NRefactory/ICSharpCode.NRefactory.CSharp/Parser/mcs/membercache.cs +++ b/src/Libraries/NRefactory/ICSharpCode.NRefactory.CSharp/Parser/mcs/membercache.cs @@ -1352,8 +1352,10 @@ namespace Mono.CSharp { type_a = parameters.Types [ii]; type_b = p_types [ii]; - if ((pd.FixedParameters [ii].ModFlags & Parameter.Modifier.ISBYREF) != - (parameters.FixedParameters [ii].ModFlags & Parameter.Modifier.ISBYREF)) + var a_byref = (pd.FixedParameters[ii].ModFlags & Parameter.Modifier.RefOutMask) != 0; + var b_byref = (parameters.FixedParameters[ii].ModFlags & Parameter.Modifier.RefOutMask) != 0; + + if (a_byref != b_byref) break; } while (TypeSpecComparer.Override.IsEqual (type_a, type_b) && ii-- != 0); @@ -1372,7 +1374,9 @@ namespace Mono.CSharp { // if (pd != null && member is MethodCore) { ii = method_param_count; - while (ii-- != 0 && parameters.FixedParameters[ii].ModFlags == pd.FixedParameters[ii].ModFlags && + while (ii-- != 0 && + (parameters.FixedParameters[ii].ModFlags & Parameter.Modifier.ModifierMask) == + (pd.FixedParameters[ii].ModFlags & Parameter.Modifier.ModifierMask) && parameters.ExtensionMethodType == pd.ExtensionMethodType) ; if (ii >= 0) { diff --git a/src/Libraries/NRefactory/ICSharpCode.NRefactory.CSharp/Parser/mcs/method.cs b/src/Libraries/NRefactory/ICSharpCode.NRefactory.CSharp/Parser/mcs/method.cs index 67438b2e18..5f15beb0be 100644 --- a/src/Libraries/NRefactory/ICSharpCode.NRefactory.CSharp/Parser/mcs/method.cs +++ b/src/Libraries/NRefactory/ICSharpCode.NRefactory.CSharp/Parser/mcs/method.cs @@ -19,6 +19,7 @@ using System.Security.Permissions; using System.Text; using System.Linq; using Mono.CompilerServices.SymbolWriter; +using System.Runtime.CompilerServices; #if NET_2_1 using XmlElement = System.Object; @@ -533,10 +534,13 @@ namespace Mono.CSharp { } if (a.Type == pa.MethodImpl) { - is_external_implementation = a.IsInternalCall (); - } + if ((ModFlags & Modifiers.ASYNC) != 0 && (a.GetMethodImplOptions () & MethodImplOptions.Synchronized) != 0) { + Report.Error (4015, a.Location, "`{0}': Async methods cannot use `MethodImplOptions.Synchronized'", + GetSignatureForError ()); + } - if (a.Type == pa.DllImport) { + is_external_implementation = a.IsInternalCall (); + } else if (a.Type == pa.DllImport) { const Modifiers extern_static = Modifiers.EXTERN | Modifiers.STATIC; if ((ModFlags & extern_static) != extern_static) { Report.Error (601, a.Location, "The DllImport attribute must be specified on a method marked `static' and `extern'"); @@ -633,7 +637,7 @@ namespace Mono.CSharp { if ((ModFlags & Modifiers.PARTIAL) != 0) { for (int i = 0; i < parameters.Count; ++i) { IParameterData p = parameters.FixedParameters [i]; - if (p.ModFlags == Parameter.Modifier.OUT) { + if ((p.ModFlags & Parameter.Modifier.OUT) != 0) { Report.Error (752, Location, "`{0}': A partial method parameters cannot use `out' modifier", GetSignatureForError ()); } @@ -888,7 +892,7 @@ namespace Mono.CSharp { var ac = parameters.Types [0] as ArrayContainer; return ac != null && ac.Rank == 1 && ac.Element.BuiltinType == BuiltinTypeSpec.Type.String && - (parameters[0].ModFlags & ~Parameter.Modifier.PARAMS) == Parameter.Modifier.NONE; + (parameters[0].ModFlags & Parameter.Modifier.RefOutMask) == 0; } public override FullNamedExpression LookupNamespaceOrType (string name, int arity, LookupMode mode, Location loc) @@ -936,7 +940,7 @@ namespace Mono.CSharp { } for (int i = 0; i < parameters.Count; ++i) { - if (parameters.FixedParameters [i].ModFlags == Parameter.Modifier.OUT) { + if ((parameters.FixedParameters [i].ModFlags & Parameter.Modifier.OUT) != 0) { Report.Error (685, Location, "Conditional method `{0}' cannot have an out parameter", GetSignatureForError ()); return; } @@ -1192,7 +1196,7 @@ namespace Mono.CSharp { Report.Error (1983, Location, "The return type of an async method must be void, Task, or Task"); } - AsyncInitializer.Create (this, block, parameters, Parent.PartialContainer, ReturnType, Location); + block = (ToplevelBlock) block.ConvertToAsyncTask (this, Parent.PartialContainer, parameters, ReturnType, Location); ModFlags |= Modifiers.DEBUGGER_HIDDEN; } } @@ -1699,6 +1703,11 @@ namespace Mono.CSharp { return null; } + public override string GetCallerMemberName () + { + return IsStatic ? TypeConstructorName : ConstructorName; + } + public override string GetSignatureForDocumentation () { return Parent.GetSignatureForDocumentation () + ".#ctor" + parameters.GetSignatureForDocumentation (); @@ -2104,7 +2113,7 @@ namespace Mono.CSharp { get; set; } - + public Destructor (TypeDefinition parent, Modifiers mod, ParametersCompiled parameters, Attributes attrs, Location l) : base (parent, null, mod, AllowedModifiers, new MemberName (MetadataName, l), attrs, parameters) { @@ -2347,6 +2356,11 @@ namespace Mono.CSharp { return false; } + public override string GetCallerMemberName () + { + return base.GetCallerMemberName ().Substring (prefix.Length); + } + public override string GetSignatureForDocumentation () { // should not be called diff --git a/src/Libraries/NRefactory/ICSharpCode.NRefactory.CSharp/Parser/mcs/module.cs b/src/Libraries/NRefactory/ICSharpCode.NRefactory.CSharp/Parser/mcs/module.cs index 85d4ff42db..3117053fcf 100644 --- a/src/Libraries/NRefactory/ICSharpCode.NRefactory.CSharp/Parser/mcs/module.cs +++ b/src/Libraries/NRefactory/ICSharpCode.NRefactory.CSharp/Parser/mcs/module.cs @@ -36,13 +36,14 @@ namespace Mono.CSharp // // Compiler generated container for static data // - sealed class StaticDataContainer : CompilerGeneratedClass + sealed class StaticDataContainer : CompilerGeneratedContainer { readonly Dictionary size_types; int fields; public StaticDataContainer (ModuleContainer module) - : base (module, new MemberName ("" + module.builder.ModuleVersionId.ToString ("B"), Location.Null), Modifiers.STATIC) + : base (module, new MemberName ("" + module.builder.ModuleVersionId.ToString ("B"), Location.Null), + Modifiers.STATIC | Modifiers.INTERNAL) { size_types = new Dictionary (); } diff --git a/src/Libraries/NRefactory/ICSharpCode.NRefactory.CSharp/Parser/mcs/nullable.cs b/src/Libraries/NRefactory/ICSharpCode.NRefactory.CSharp/Parser/mcs/nullable.cs index 0860b91565..1e46767cf1 100644 --- a/src/Libraries/NRefactory/ICSharpCode.NRefactory.CSharp/Parser/mcs/nullable.cs +++ b/src/Libraries/NRefactory/ICSharpCode.NRefactory.CSharp/Parser/mcs/nullable.cs @@ -860,7 +860,7 @@ namespace Mono.CSharp.Nullable if (lifted_type == null) return null; - if (left is UserCast || left is TypeCast) + if (left is UserCast || left is EmptyCast || left is OpcodeCast) left.Type = lifted_type; else left = EmptyCast.Create (left, lifted_type); @@ -875,7 +875,7 @@ namespace Mono.CSharp.Nullable if (r is ReducedExpression) r = ((ReducedExpression) r).OriginalExpression; - if (r is UserCast || r is TypeCast) + if (r is UserCast || r is EmptyCast || r is OpcodeCast) r.Type = lifted_type; else right = EmptyCast.Create (right, lifted_type); diff --git a/src/Libraries/NRefactory/ICSharpCode.NRefactory.CSharp/Parser/mcs/parameter.cs b/src/Libraries/NRefactory/ICSharpCode.NRefactory.CSharp/Parser/mcs/parameter.cs index fc0ea07954..365f876f0a 100644 --- a/src/Libraries/NRefactory/ICSharpCode.NRefactory.CSharp/Parser/mcs/parameter.cs +++ b/src/Libraries/NRefactory/ICSharpCode.NRefactory.CSharp/Parser/mcs/parameter.cs @@ -209,21 +209,23 @@ namespace Mono.CSharp { [Flags] public enum Modifier : byte { NONE = 0, - REF = REFMASK | ISBYREF, - OUT = OUTMASK | ISBYREF, - PARAMS = 4, - // This is a flag which says that it's either REF or OUT. - ISBYREF = 8, - REFMASK = 32, - OUTMASK = 64, - SignatureMask = REFMASK | OUTMASK, - This = 128 + PARAMS = 1 << 0, + REF = 1 << 1, + OUT = 1 << 2, + This = 1 << 3, + CallerMemberName = 1 << 4, + CallerLineNumber = 1 << 5, + CallerFilePath = 1 << 6, + + RefOutMask = REF | OUT, + ModifierMask = PARAMS | REF | OUT | This, + CallerMask = CallerMemberName | CallerLineNumber | CallerFilePath } static readonly string[] attribute_targets = new string[] { "param" }; FullNamedExpression texpr; - readonly Modifier modFlags; + Modifier modFlags; string name; Expression default_expr; protected TypeSpec parameter_type; @@ -233,7 +235,7 @@ namespace Mono.CSharp { TemporaryVariableReference expr_tree_variable; - HoistedVariable hoisted_variant; + HoistedParameter hoisted_variant; public Parameter (FullNamedExpression type, string name, Modifier mod, Attributes attrs, Location loc) { @@ -323,7 +325,7 @@ namespace Mono.CSharp { return; } - if (a.Type == pa.Out && (ModFlags & Modifier.REF) == Modifier.REF && + if (a.Type == pa.Out && (ModFlags & Modifier.REF) != 0 && !OptAttributes.Contains (pa.In)) { a.Report.Error (662, a.Location, "Cannot specify only `Out' attribute on a ref parameter. Use both `In' and `Out' attributes or neither"); @@ -332,9 +334,7 @@ namespace Mono.CSharp { if (a.Type == pa.CLSCompliant) { a.Report.Warning (3022, 1, a.Location, "CLSCompliant attribute has no meaning when applied to parameters. Try putting it on the method instead"); - } - - if (a.Type == pa.DefaultParameterValue || a.Type == pa.OptionalParameter) { + } else if (a.Type == pa.DefaultParameterValue || a.Type == pa.OptionalParameter) { if (HasOptionalExpression) { a.Report.Error (1745, a.Location, "Cannot specify `{0}' attribute on optional parameter `{1}'", @@ -343,6 +343,21 @@ namespace Mono.CSharp { if (a.Type == pa.DefaultParameterValue) return; + } else if (a.Type == pa.CallerMemberNameAttribute) { + if ((modFlags & Modifier.CallerMemberName) == 0) { + a.Report.Error (4022, a.Location, + "The CallerMemberName attribute can only be applied to parameters with default value"); + } + } else if (a.Type == pa.CallerLineNumberAttribute) { + if ((modFlags & Modifier.CallerLineNumber) == 0) { + a.Report.Error (4020, a.Location, + "The CallerLineNumber attribute can only be applied to parameters with default value"); + } + } else if (a.Type == pa.CallerFilePathAttribute) { + if ((modFlags & Modifier.CallerFilePath) == 0) { + a.Report.Error (4021, a.Location, + "The CallerFilePath attribute can only be applied to parameters with default value"); + } } base.ApplyAttributeBuilder (a, ctor, cdata, pa); @@ -372,15 +387,15 @@ namespace Mono.CSharp { return null; this.idx = index; - - if ((modFlags & Parameter.Modifier.ISBYREF) != 0 && parameter_type.IsSpecialRuntimeType) { + + if ((modFlags & Parameter.Modifier.RefOutMask) != 0 && parameter_type.IsSpecialRuntimeType) { rc.Module.Compiler.Report.Error (1601, Location, "Method or delegate parameter cannot be of type `{0}'", GetSignatureForError ()); return null; } TypeManager.CheckTypeVariance (parameter_type, - (modFlags & Parameter.Modifier.ISBYREF) != 0 ? Variance.None : Variance.Contravariant, + (modFlags & Parameter.Modifier.RefOutMask) != 0 ? Variance.None : Variance.Contravariant, rc); if (parameter_type.IsStatic) { @@ -397,6 +412,54 @@ namespace Mono.CSharp { return parameter_type; } + void ResolveCallerAttributes (ResolveContext rc) + { + var pa = rc.Module.PredefinedAttributes; + TypeSpec caller_type; + + foreach (var attr in attributes.Attrs) { + var atype = attr.ResolveType (); + if (atype == null) + continue; + + if (atype == pa.CallerMemberNameAttribute) { + caller_type = rc.BuiltinTypes.String; + if (caller_type != parameter_type && !Convert.ImplicitReferenceConversionExists (caller_type, parameter_type)) { + rc.Report.Error (4019, attr.Location, + "The CallerMemberName attribute cannot be applied because there is no standard conversion from `{0}' to `{1}'", + caller_type.GetSignatureForError (), parameter_type.GetSignatureForError ()); + } + + modFlags |= Modifier.CallerMemberName; + continue; + } + + if (atype == pa.CallerLineNumberAttribute) { + caller_type = rc.BuiltinTypes.Int; + if (caller_type != parameter_type && !Convert.ImplicitNumericConversionExists (caller_type, parameter_type)) { + rc.Report.Error (4017, attr.Location, + "The CallerMemberName attribute cannot be applied because there is no standard conversion from `{0}' to `{1}'", + caller_type.GetSignatureForError (), parameter_type.GetSignatureForError ()); + } + + modFlags |= Modifier.CallerLineNumber; + continue; + } + + if (atype == pa.CallerFilePathAttribute) { + caller_type = rc.BuiltinTypes.String; + if (caller_type != parameter_type && !Convert.ImplicitReferenceConversionExists (caller_type, parameter_type)) { + rc.Report.Error (4018, attr.Location, + "The CallerFilePath attribute cannot be applied because there is no standard conversion from `{0}' to `{1}'", + caller_type.GetSignatureForError (), parameter_type.GetSignatureForError ()); + } + + modFlags |= Modifier.CallerFilePath; + continue; + } + } + } + public void ResolveDefaultValue (ResolveContext rc) { // @@ -404,14 +467,17 @@ namespace Mono.CSharp { // if (default_expr != null) { ((DefaultParameterValueExpression)default_expr).Resolve (rc, this); + if (attributes != null) + ResolveCallerAttributes (rc); + return; } if (attributes == null) return; - - var opt_attr = attributes.Search (rc.Module.PredefinedAttributes.OptionalParameter); - var def_attr = attributes.Search (rc.Module.PredefinedAttributes.DefaultParameterValue); + + var pa = rc.Module.PredefinedAttributes; + var def_attr = attributes.Search (pa.DefaultParameterValue); if (def_attr != null) { if (def_attr.Resolve () == null) return; @@ -466,6 +532,7 @@ namespace Mono.CSharp { return; } + var opt_attr = attributes.Search (pa.OptionalParameter); if (opt_attr != null) { default_expr = EmptyExpression.MissingValue; } @@ -482,7 +549,7 @@ namespace Mono.CSharp { // // Hoisted parameter variant // - public HoistedVariable HoistedVariant { + public HoistedParameter HoistedVariant { get { return hoisted_variant; } @@ -611,7 +678,7 @@ namespace Mono.CSharp { public ExpressionStatement CreateExpressionTreeVariable (BlockContext ec) { - if ((modFlags & Modifier.ISBYREF) != 0) + if ((modFlags & Modifier.RefOutMask) != 0) ec.Report.Error (1951, Location, "An expression tree parameter cannot use `ref' or `out' modifier"); expr_tree_variable = TemporaryVariableReference.Create (ResolveParameterExpressionType (ec, Location).Type, ec.CurrentBlock.ParametersBlock, Location); @@ -636,7 +703,7 @@ namespace Mono.CSharp { public void EmitAddressOf (EmitContext ec) { - if ((ModFlags & Modifier.ISBYREF) != 0) { + if ((ModFlags & Modifier.RefOutMask) != 0) { ec.EmitArgumentLoad (idx); } else { ec.EmitArgumentAddress (idx); @@ -701,7 +768,7 @@ namespace Mono.CSharp { } public Parameter.Modifier ModFlags { - get { return modifiers & ~Parameter.Modifier.This; } + get { return modifiers; } } public string Name { @@ -750,7 +817,7 @@ namespace Mono.CSharp { public static ParameterAttributes GetParameterAttribute (Parameter.Modifier modFlags) { - return (modFlags & Parameter.Modifier.OUT) == Parameter.Modifier.OUT ? + return (modFlags & Parameter.Modifier.OUT) != 0 ? ParameterAttributes.Out : ParameterAttributes.None; } @@ -773,7 +840,7 @@ namespace Mono.CSharp { for (int i = 0; i < types.Length; ++i) { types[i] = Types[i].GetMetaInfo (); - if ((FixedParameters [i].ModFlags & Parameter.Modifier.ISBYREF) == 0) + if ((FixedParameters[i].ModFlags & Parameter.Modifier.RefOutMask) == 0) continue; // TODO MemberCache: Should go to MetaInfo getter @@ -808,7 +875,7 @@ namespace Mono.CSharp { sb.Append (types [i].GetSignatureForDocumentation ()); - if ((parameters[i].ModFlags & Parameter.Modifier.ISBYREF) != 0) + if ((parameters[i].ModFlags & Parameter.Modifier.RefOutMask) != 0) sb.Append ("@"); } sb.Append (")"); @@ -1027,8 +1094,7 @@ namespace Mono.CSharp { var a_type = a.Types[i]; var b_type = b.Types[i]; if (TypeSpecComparer.Override.IsEqual (a_type, b_type)) { - const Parameter.Modifier ref_out = Parameter.Modifier.REF | Parameter.Modifier.OUT; - if ((a.FixedParameters[i].ModFlags & ref_out) != (b.FixedParameters[i].ModFlags & ref_out)) + if ((a.FixedParameters[i].ModFlags & Parameter.Modifier.RefOutMask) != (b.FixedParameters[i].ModFlags & Parameter.Modifier.RefOutMask)) res |= 1; continue; diff --git a/src/Libraries/NRefactory/ICSharpCode.NRefactory.CSharp/Parser/mcs/pending.cs b/src/Libraries/NRefactory/ICSharpCode.NRefactory.CSharp/Parser/mcs/pending.cs index 1ade2bd856..b331286293 100644 --- a/src/Libraries/NRefactory/ICSharpCode.NRefactory.CSharp/Parser/mcs/pending.cs +++ b/src/Libraries/NRefactory/ICSharpCode.NRefactory.CSharp/Parser/mcs/pending.cs @@ -305,11 +305,10 @@ namespace Mono.CSharp { // // First check exact modifiers match // - const Parameter.Modifier ref_out = Parameter.Modifier.REF | Parameter.Modifier.OUT; - if ((cp[pi].ModFlags & ref_out) == (tp[pi].ModFlags & ref_out)) + if ((cp[pi].ModFlags & Parameter.Modifier.RefOutMask) == (tp[pi].ModFlags & Parameter.Modifier.RefOutMask)) continue; - if ((cp[pi].ModFlags & tp[pi].ModFlags & Parameter.Modifier.ISBYREF) != 0) { + if (((cp[pi].ModFlags | tp[pi].ModFlags) & Parameter.Modifier.RefOutMask) == Parameter.Modifier.RefOutMask) { ref_only_difference = true; continue; } @@ -557,8 +556,7 @@ namespace Mono.CSharp { // // First check exact ref/out match // - const Parameter.Modifier ref_out = Parameter.Modifier.REF | Parameter.Modifier.OUT; - if ((parameters.FixedParameters[i].ModFlags & ref_out) == (candidate_param.FixedParameters[i].ModFlags & ref_out)) + if ((parameters.FixedParameters[i].ModFlags & Parameter.Modifier.RefOutMask) == (candidate_param.FixedParameters[i].ModFlags & Parameter.Modifier.RefOutMask)) continue; modifiers_match = false; @@ -566,7 +564,7 @@ namespace Mono.CSharp { // // Different in ref/out only // - if ((parameters.FixedParameters[i].ModFlags & candidate_param.FixedParameters[i].ModFlags & Parameter.Modifier.ISBYREF) != 0) { + if ((parameters.FixedParameters[i].ModFlags & Parameter.Modifier.RefOutMask) != (candidate_param.FixedParameters[i].ModFlags & Parameter.Modifier.RefOutMask)) { if (similar_candidate == null) { if (!candidate.IsPublic) break; diff --git a/src/Libraries/NRefactory/ICSharpCode.NRefactory.CSharp/Parser/mcs/report.cs b/src/Libraries/NRefactory/ICSharpCode.NRefactory.CSharp/Parser/mcs/report.cs index d8a2e2fc76..50d78f0071 100644 --- a/src/Libraries/NRefactory/ICSharpCode.NRefactory.CSharp/Parser/mcs/report.cs +++ b/src/Libraries/NRefactory/ICSharpCode.NRefactory.CSharp/Parser/mcs/report.cs @@ -55,7 +55,8 @@ namespace Mono.CSharp { 2002, 2023, 2029, 3000, 3001, 3002, 3003, 3005, 3006, 3007, 3008, 3009, 3010, 3011, 3012, 3013, 3014, 3015, 3016, 3017, 3018, 3019, - 3021, 3022, 3023, 3024, 3026, 3027 + 3021, 3022, 3023, 3024, 3026, 3027, + 4014 }; static HashSet AllWarningsHashSet; diff --git a/src/Libraries/NRefactory/ICSharpCode.NRefactory.CSharp/Parser/mcs/statement.cs b/src/Libraries/NRefactory/ICSharpCode.NRefactory.CSharp/Parser/mcs/statement.cs index f70c02af32..4a71f027d1 100644 --- a/src/Libraries/NRefactory/ICSharpCode.NRefactory.CSharp/Parser/mcs/statement.cs +++ b/src/Libraries/NRefactory/ICSharpCode.NRefactory.CSharp/Parser/mcs/statement.cs @@ -68,6 +68,10 @@ namespace Mono.CSharp { { ec.Mark (loc); DoEmit (ec); + + if (ec.StatementEpilogue != null) { + ec.EmitEpilogue (); + } } // @@ -856,6 +860,8 @@ namespace Mono.CSharp { ec.Report.Error (127, loc, "`{0}': A return keyword must not be followed by any expression when method returns void", ec.GetSignatureForError ()); + + return false; } } else { if (am.IsIterator) { @@ -874,12 +880,21 @@ namespace Mono.CSharp { return true; } + // TODO: Better error message + if (async_type.Kind == MemberKind.Void) { + ec.Report.Error (127, loc, + "`{0}': A return keyword must not be followed by any expression when method returns void", + ec.GetSignatureForError ()); + + return false; + } + if (!async_type.IsGenericTask) { if (this is ContextualReturn) return true; ec.Report.Error (1997, loc, - "`{0}': A return keyword must not be followed by an expression when async method returns Task. Consider using Task", + "`{0}': A return keyword must not be followed by an expression when async method returns `Task'. Consider using `Task' return type", ec.GetSignatureForError ()); return false; } @@ -887,7 +902,13 @@ namespace Mono.CSharp { // // The return type is actually Task type argument // - block_return_type = async_type.TypeArguments[0]; + if (expr.Type == async_type) { + ec.Report.Error (4016, loc, + "`{0}': The return expression type of async method must be `{1}' rather than `Task<{1}>'", + ec.GetSignatureForError (), async_type.TypeArguments[0].GetSignatureForError ()); + } else { + block_return_type = async_type.TypeArguments[0]; + } } } else { var l = am as AnonymousMethodBody; @@ -901,7 +922,7 @@ namespace Mono.CSharp { if (expr == null) return false; - if (expr.Type != block_return_type) { + if (expr.Type != block_return_type && expr.Type != InternalType.ErrorType) { expr = Convert.ImplicitConversionRequired (ec, expr, block_return_type, loc); if (expr == null) { @@ -930,12 +951,16 @@ namespace Mono.CSharp { if (async_return != null) { async_return.EmitAssign (ec); + ec.EmitEpilogue (); + ec.Emit (unwind_protect ? OpCodes.Leave : OpCodes.Br, async_body.BodyEnd); } return; } + ec.EmitEpilogue (); + if (unwind_protect || ec.EmitAccurateDebugInfo) ec.Emit (OpCodes.Stloc, ec.TemporaryReturn ()); } @@ -1190,9 +1215,9 @@ namespace Mono.CSharp { res = c; } else { TypeSpec type = ec.Switch.SwitchType; - res = c.TryReduce (ec, type, c.Location); + res = c.TryReduce (ec, type); if (res == null) { - c.Error_ValueCannotBeConverted (ec, loc, type, true); + c.Error_ValueCannotBeConverted (ec, type, true); return false; } @@ -1656,7 +1681,7 @@ namespace Mono.CSharp { if (TypeSpec.IsReferenceType (li.Type)) initializer.Error_ConstantCanBeInitializedWithNullOnly (bc, li.Type, initializer.Location, li.Name); else - initializer.Error_ValueCannotBeConverted (bc, initializer.Location, li.Type, false); + initializer.Error_ValueCannotBeConverted (bc, li.Type, false); return null; } @@ -1767,6 +1792,12 @@ namespace Mono.CSharp { } } + public bool IsCompilerGenerated { + get { + return (flags & Flags.CompilerGenerated) != 0; + } + } + public bool IsConstant { get { return (flags & Flags.Constant) != 0; @@ -2025,8 +2056,8 @@ namespace Mono.CSharp { static int id; public int ID = id++; -// static int clone_id_counter; -// int clone_id; + static int clone_id_counter; + int clone_id; #endif // int assignable_slots; @@ -2338,7 +2369,7 @@ namespace Mono.CSharp { { Block target = (Block) t; #if DEBUG -// target.clone_id = clone_id_counter++; + target.clone_id = clone_id_counter++; #endif clonectx.AddBlockMap (this, target); @@ -2392,14 +2423,22 @@ namespace Mono.CSharp { } public bool HasCapturedThis { - set { flags = value ? flags | Flags.HasCapturedThis : flags & ~Flags.HasCapturedThis; } + set { + flags = value ? flags | Flags.HasCapturedThis : flags & ~Flags.HasCapturedThis; + } get { return (flags & Flags.HasCapturedThis) != 0; } } + // + // Used to indicate that the block has reference to parent + // block and cannot be made static when defining anonymous method + // public bool HasCapturedVariable { - set { flags = value ? flags | Flags.HasCapturedVariable : flags & ~Flags.HasCapturedVariable; } + set { + flags = value ? flags | Flags.HasCapturedVariable : flags & ~Flags.HasCapturedVariable; + } get { return (flags & Flags.HasCapturedVariable) != 0; } @@ -2426,11 +2465,12 @@ namespace Mono.CSharp { return ec.CurrentAnonymousMethod.Storey; // - // When referencing a variable in parent iterator/async storey - // from nested anonymous method + // When referencing a variable inside iterator where all + // variables will be captured anyway we don't need to create + // another storey context // - if (ParametersBlock.am_storey is StateMachine) { - return ParametersBlock.am_storey; + if (ParametersBlock.StateMachine is IteratorStorey) { + return ParametersBlock.StateMachine; } if (am_storey == null) { @@ -2439,7 +2479,7 @@ namespace Mono.CSharp { // // Creates anonymous method storey for this block // - am_storey = new AnonymousMethodStorey (this, ec.CurrentMemberDefinition.Parent.PartialContainer, mc, ec.CurrentTypeParameters, "AnonStorey"); + am_storey = new AnonymousMethodStorey (this, ec.CurrentMemberDefinition.Parent.PartialContainer, mc, ec.CurrentTypeParameters, "AnonStorey", MemberKind.Class); } return am_storey; @@ -2448,7 +2488,7 @@ namespace Mono.CSharp { public override void Emit (EmitContext ec) { if (am_storey != null) { - DefineAnonymousStorey (ec); + DefineStoreyContainer (ec, am_storey); am_storey.EmitStoreyInstantiation (ec, this); } @@ -2472,57 +2512,112 @@ namespace Mono.CSharp { } } - void DefineAnonymousStorey (EmitContext ec) + protected void DefineStoreyContainer (EmitContext ec, AnonymousMethodStorey storey) { + if (ec.CurrentAnonymousMethod != null && ec.CurrentAnonymousMethod.Storey != null) { + storey.SetNestedStoryParent (ec.CurrentAnonymousMethod.Storey); + storey.Mutator = ec.CurrentAnonymousMethod.Storey.Mutator; + } + // // Creates anonymous method storey // - if (ec.CurrentAnonymousMethod != null && ec.CurrentAnonymousMethod.Storey != null) { + storey.CreateContainer (); + storey.DefineContainer (); + + if (Original.Explicit.HasCapturedThis && Original.ParametersBlock.TopBlock.ThisReferencesFromChildrenBlock != null) { + // - // Creates parent storey reference when hoisted this is accessible + // Only first storey in path will hold this reference. All children blocks will + // reference it indirectly using $ref field // - if (am_storey.OriginalSourceBlock.Explicit.HasCapturedThis) { - ExplicitBlock parent = am_storey.OriginalSourceBlock.Explicit.Parent.Explicit; + for (Block b = Original.Explicit.Parent; b != null; b = b.Parent) { + var s = b.Explicit.AnonymousMethodStorey; + if (s != null) { + storey.HoistedThis = s.HoistedThis; + break; + } + } - // - // Hoisted this exists in top-level parent storey only - // - while (parent.am_storey == null || parent.am_storey.Parent is AnonymousMethodStorey) - parent = parent.Parent.Explicit; + // + // We are the first storey on path and this has to be hoisted + // + if (storey.HoistedThis == null) { + foreach (ExplicitBlock ref_block in Original.ParametersBlock.TopBlock.ThisReferencesFromChildrenBlock) { + // + // ThisReferencesFromChildrenBlock holds all reference even if they + // are not on this path. It saves some memory otherwise it'd have to + // be in every explicit block. We run this check to see if the reference + // is valid for this storey + // + Block block_on_path = ref_block; + for (; block_on_path != null && block_on_path != Original; block_on_path = block_on_path.Parent); - am_storey.AddParentStoreyReference (ec, parent.am_storey); - } + if (block_on_path == null) + continue; - am_storey.SetNestedStoryParent (ec.CurrentAnonymousMethod.Storey); + if (storey.HoistedThis == null) + storey.AddCapturedThisField (ec); - // TODO MemberCache: Review - am_storey.Mutator = ec.CurrentAnonymousMethod.Storey.Mutator; - } + for (ExplicitBlock b = ref_block; b.AnonymousMethodStorey != storey; b = b.Parent.Explicit) { + if (b.AnonymousMethodStorey != null) { + b.AnonymousMethodStorey.AddParentStoreyReference (ec, storey); + b.AnonymousMethodStorey.HoistedThis = storey.HoistedThis; + + // + // Stop propagation inside same top block + // + if (b.ParametersBlock == ParametersBlock.Original) + break; + + b = b.ParametersBlock; + } + + var pb = b as ParametersBlock; + if (pb != null && pb.StateMachine != null) { + if (pb.StateMachine == storey) + break; - am_storey.CreateContainer (); - am_storey.DefineContainer (); + pb.StateMachine.AddParentStoreyReference (ec, storey); + } + + b.HasCapturedVariable = true; + } + } + } + } - var ref_blocks = am_storey.ReferencesFromChildrenBlock; + var ref_blocks = storey.ReferencesFromChildrenBlock; if (ref_blocks != null) { foreach (ExplicitBlock ref_block in ref_blocks) { - for (ExplicitBlock b = ref_block.Explicit; b.am_storey != am_storey; b = b.Parent.Explicit) { - if (b.am_storey != null) { - b.am_storey.AddParentStoreyReference (ec, am_storey); + for (ExplicitBlock b = ref_block; b.AnonymousMethodStorey != storey; b = b.Parent.Explicit) { + if (b.AnonymousMethodStorey != null) { + b.AnonymousMethodStorey.AddParentStoreyReference (ec, storey); + // // Stop propagation inside same top block - if (b.ParametersBlock.Original == ParametersBlock.Original) + // + if (b.ParametersBlock == ParametersBlock.Original) break; b = b.ParametersBlock; } + var pb = b as ParametersBlock; + if (pb != null && pb.StateMachine != null) { + if (pb.StateMachine == storey) + break; + + pb.StateMachine.AddParentStoreyReference (ec, storey); + } + b.HasCapturedVariable = true; } } } - am_storey.Define (); - am_storey.Parent.PartialContainer.AddCompilerGeneratedClass (am_storey); + storey.Define (); + storey.Parent.PartialContainer.AddCompilerGeneratedClass (storey); } public void RegisterAsyncAwait () @@ -2531,7 +2626,7 @@ namespace Mono.CSharp { while ((block.flags & Flags.AwaitBlock) == 0) { block.flags |= Flags.AwaitBlock; - if (block.Parent == null) + if (block is ParametersBlock) return; block = block.Parent.Explicit; @@ -2580,7 +2675,13 @@ namespace Mono.CSharp { #region Properties - public Block Block { + public ParametersBlock Block { + get { + return block; + } + } + + Block INamedBlockVariable.Block { get { return block; } @@ -2683,6 +2784,7 @@ namespace Mono.CSharp { bool resolved; protected bool unreachable; protected ToplevelBlock top_block; + protected StateMachine state_machine; public ParametersBlock (Block parent, ParametersCompiled parameters, Location start) : base (parent, 0, start, start) @@ -2722,6 +2824,7 @@ namespace Mono.CSharp { this.resolved = true; this.unreachable = source.unreachable; this.am_storey = source.am_storey; + this.state_machine = source.state_machine; ParametersBlock = this; @@ -2761,6 +2864,12 @@ namespace Mono.CSharp { } } + public StateMachine StateMachine { + get { + return state_machine; + } + } + public ToplevelBlock TopBlock { get { return top_block; @@ -2816,6 +2925,26 @@ namespace Mono.CSharp { return base.CreateExpressionTree (ec); } + public override void Emit (EmitContext ec) + { + if (state_machine != null && state_machine.OriginalSourceBlock != this) { + DefineStoreyContainer (ec, state_machine); + state_machine.EmitStoreyInstantiation (ec, this); + } + + base.Emit (ec); + } + + public void EmitEmbedded (EmitContext ec) + { + if (state_machine != null && state_machine.OriginalSourceBlock != this) { + DefineStoreyContainer (ec, state_machine); + state_machine.EmitStoreyInstantiation (ec, this); + } + + base.Emit (ec); + } + public ParameterInfo GetParameterInfo (Parameter p) { for (int i = 0; i < parameters.Count; ++i) { @@ -2826,7 +2955,7 @@ namespace Mono.CSharp { throw new ArgumentException ("Invalid parameter"); } - public Expression GetParameterReference (int index, Location loc) + public ParameterReference GetParameterReference (int index, Location loc) { return new ParameterReference (parameter_info[index], loc); } @@ -2929,7 +3058,7 @@ namespace Mono.CSharp { for (int i = 0; i < orig_count; ++i) { Parameter.Modifier mod = parameters.FixedParameters[i].ModFlags; - if ((mod & Parameter.Modifier.OUT) != Parameter.Modifier.OUT) + if ((mod & Parameter.Modifier.OUT) == 0) continue; VariableInfo vi = new VariableInfo (parameters, i, ec.FlowOffset); @@ -2938,37 +3067,71 @@ namespace Mono.CSharp { } } - public void WrapIntoIterator (IMethodData method, TypeDefinition host, TypeSpec iterator_type, bool is_enumerable) + public ToplevelBlock ConvertToIterator (IMethodData method, TypeDefinition host, TypeSpec iterator_type, bool is_enumerable) { - ParametersBlock pb = new ParametersBlock (this, ParametersCompiled.EmptyReadOnlyParameters, Location.Null); - pb.statements = statements; - pb.Original = this; + var iterator = new Iterator (this, method, host, iterator_type, is_enumerable); + var stateMachine = new IteratorStorey (iterator); - var iterator = new Iterator (pb, method, host, iterator_type, is_enumerable); - am_storey = new IteratorStorey (iterator); + state_machine = stateMachine; + iterator.SetStateMachine (stateMachine); - statements = new List (1); - AddStatement (new Return (iterator, iterator.Location)); - flags &= ~Flags.YieldBlock; - IsCompilerGenerated = true; + var tlb = new ToplevelBlock (host.Compiler, Parameters, Location.Null); + tlb.Original = this; + tlb.IsCompilerGenerated = true; + tlb.state_machine = stateMachine; + tlb.AddStatement (new Return (iterator, iterator.Location)); + return tlb; } - public void WrapIntoAsyncTask (IMemberContext context, TypeDefinition host, TypeSpec returnType) + public ParametersBlock ConvertToAsyncTask (IMemberContext context, TypeDefinition host, ParametersCompiled parameters, TypeSpec returnType, Location loc) { - ParametersBlock pb = new ParametersBlock (this, ParametersCompiled.EmptyReadOnlyParameters, Location.Null); - pb.statements = statements; - pb.Original = this; + for (int i = 0; i < parameters.Count; i++) { + Parameter p = parameters[i]; + Parameter.Modifier mod = p.ModFlags; + if ((mod & Parameter.Modifier.RefOutMask) != 0) { + host.Compiler.Report.Error (1988, p.Location, + "Async methods cannot have ref or out parameters"); + return this; + } + + if (p is ArglistParameter) { + host.Compiler.Report.Error (4006, p.Location, + "__arglist is not allowed in parameter list of async methods"); + return this; + } + + if (parameters.Types[i].IsPointer) { + host.Compiler.Report.Error (4005, p.Location, + "Async methods cannot have unsafe parameters"); + return this; + } + } + + if (!HasAwait) { + host.Compiler.Report.Warning (1998, 1, loc, + "Async block lacks `await' operator and will run synchronously"); + } var block_type = host.Module.Compiler.BuiltinTypes.Void; - var initializer = new AsyncInitializer (pb, host, block_type); + var initializer = new AsyncInitializer (this, host, block_type); initializer.Type = block_type; - am_storey = new AsyncTaskStorey (context, initializer, returnType); + var stateMachine = new AsyncTaskStorey (this, context, initializer, returnType); - statements = new List (1); - AddStatement (new StatementExpression (initializer)); - flags &= ~Flags.AwaitBlock; - IsCompilerGenerated = true; + state_machine = stateMachine; + initializer.SetStateMachine (stateMachine); + + var b = this is ToplevelBlock ? + new ToplevelBlock (host.Compiler, Parameters, Location.Null) : + new ParametersBlock (Parent, parameters, Location.Null) { + IsAsync = true, + }; + + b.Original = this; + b.IsCompilerGenerated = true; + b.state_machine = stateMachine; + b.AddStatement (new StatementExpression (initializer)); + return b; } } @@ -2982,11 +3145,7 @@ namespace Mono.CSharp { Dictionary names; Dictionary labels; - public HoistedVariable HoistedThisVariable; - - public Report Report { - get { return compiler.Report; } - } + List this_references; public ToplevelBlock (CompilerContext ctx, Location loc) : this (ctx, ParametersCompiled.EmptyReadOnlyParameters, loc) @@ -3023,6 +3182,31 @@ namespace Mono.CSharp { } } + public Report Report { + get { + return compiler.Report; + } + } + + // + // Used by anonymous blocks to track references of `this' variable + // + public List ThisReferencesFromChildrenBlock { + get { + return this_references; + } + } + + // + // Returns the "this" instance variable of this block. + // See AddThisVariable() for more information. + // + public LocalVariable ThisVariable { + get { + return this_variable; + } + } + public void AddLocalName (string name, INamedBlockVariable li, bool ignoreChildrenBlocks) { if (names == null) @@ -3143,6 +3327,20 @@ namespace Mono.CSharp { existing_list.Add (label); } + public void AddThisReferenceFromChildrenBlock (ExplicitBlock block) + { + if (this_references == null) + this_references = new List (); + + if (!this_references.Contains (block)) + this_references.Add (block); + } + + public void RemoveThisReferenceFromChildrenBlock (ExplicitBlock block) + { + this_references.Remove (block); + } + // // Creates an arguments set from all parameters, useful for method proxy calls // @@ -3253,14 +3451,6 @@ namespace Mono.CSharp { return null; } - // - // Returns the "this" instance variable of this block. - // See AddThisVariable() for more information. - // - public LocalVariable ThisVariable { - get { return this_variable; } - } - // // This is used by non-static `struct' constructors which do not have an // initializer - in this case, the constructor must initialize all of the @@ -4099,7 +4289,7 @@ namespace Mono.CSharp { var ctype = ec.CurrentMemberDefinition.Parent.PartialContainer; Field field = new Field (ctype, string_dictionary_type, Modifiers.STATIC | Modifiers.PRIVATE | Modifiers.COMPILER_GENERATED, - new MemberName (CompilerGeneratedClass.MakeName (null, "f", "switch$map", ec.Module.CounterSwitchTypes++), loc), null); + new MemberName (CompilerGeneratedContainer.MakeName (null, "f", "switch$map", ec.Module.CounterSwitchTypes++), loc), null); if (!field.Define ()) return; ctype.AddField (field); @@ -4302,6 +4492,7 @@ namespace Mono.CSharp { protected Statement stmt; Label dispose_try_block; bool prepared_for_dispose, emitted_dispose; + Method finally_host; protected TryFinallyBlock (Statement stmt, Location loc) : base (loc) @@ -4320,7 +4511,7 @@ namespace Mono.CSharp { #endregion protected abstract void EmitTryBody (EmitContext ec); - protected abstract void EmitFinallyBody (EmitContext ec); + public abstract void EmitFinallyBody (EmitContext ec); public override Label PrepareForDispose (EmitContext ec, Label end) { @@ -4348,7 +4539,14 @@ namespace Mono.CSharp { } ec.MarkLabel (start_finally); - EmitFinallyBody (ec); + + if (finally_host != null) { + var ce = new CallEmitter (); + ce.InstanceExpression = new CompilerGeneratedThis (ec.CurrentType, loc); + ce.EmitPredefined (ec, finally_host.Spec, new Arguments (0)); + } else { + EmitFinallyBody (ec); + } ec.EndExceptionBlock (); } @@ -4392,12 +4590,10 @@ namespace Mono.CSharp { bool emit_dispatcher = j < labels.Length; if (emit_dispatcher) { - //SymbolWriter.StartIteratorDispatcher (ec.ig); ec.Emit (OpCodes.Ldloc, pc); ec.EmitInt (first_resume_pc); ec.Emit (OpCodes.Sub); ec.Emit (OpCodes.Switch, labels); - //SymbolWriter.EndIteratorDispatcher (ec.ig); } foreach (ResumableStatement s in resume_points) @@ -4408,10 +4604,34 @@ namespace Mono.CSharp { ec.BeginFinallyBlock (); - EmitFinallyBody (ec); + if (finally_host != null) { + var ce = new CallEmitter (); + ce.InstanceExpression = new CompilerGeneratedThis (ec.CurrentType, loc); + ce.EmitPredefined (ec, finally_host.Spec, new Arguments (0)); + } else { + EmitFinallyBody (ec); + } ec.EndExceptionBlock (); } + + public override bool Resolve (BlockContext bc) + { + // + // Finally block inside iterator is called from MoveNext and + // Dispose methods that means we need to lift the block into + // newly created host method to emit the body only once. The + // original block then simply calls the newly generated method. + // + if (bc.CurrentIterator != null && !bc.IsInProbingMode) { + var b = stmt as Block; + if (b != null && b.Explicit.HasYield) { + finally_host = bc.CurrentIterator.CreateFinallyHost (this); + } + } + + return base.Resolve (bc); + } } // @@ -4600,7 +4820,7 @@ namespace Mono.CSharp { Statement.Emit (ec); } - protected override void EmitFinallyBody (EmitContext ec) + public override void EmitFinallyBody (EmitContext ec) { // // if (lock_taken) Monitor.Exit (expr_copy) @@ -5203,6 +5423,7 @@ namespace Mono.CSharp { if (ok) ec.CurrentBranching.CreateSibling (fini, FlowBranching.SiblingType.Finally); + using (ec.With (ResolveContext.Options.FinallyScope, true)) { if (!fini.Resolve (ec)) ok = false; @@ -5220,7 +5441,7 @@ namespace Mono.CSharp { stmt.Emit (ec); } - protected override void EmitFinallyBody (EmitContext ec) + public override void EmitFinallyBody (EmitContext ec) { fini.Emit (ec); } @@ -5564,7 +5785,7 @@ namespace Mono.CSharp { stmt.Emit (ec); } - protected override void EmitFinallyBody (EmitContext ec) + public override void EmitFinallyBody (EmitContext ec) { decl.EmitDispose (ec); } @@ -5630,27 +5851,43 @@ namespace Mono.CSharp { /// public class Foreach : Statement { - sealed class ArrayForeach : Statement + abstract class IteratorStatement : Statement { - readonly Foreach for_each; - readonly Statement statement; + protected readonly Foreach for_each; + + protected IteratorStatement (Foreach @foreach) + { + this.for_each = @foreach; + this.loc = @foreach.expr.Location; + } + + protected override void CloneTo (CloneContext clonectx, Statement target) + { + throw new NotImplementedException (); + } + + public override void Emit (EmitContext ec) + { + if (ec.EmitAccurateDebugInfo) { + ec.Emit (OpCodes.Nop); + } - Expression conv; + base.Emit (ec); + } + } + + sealed class ArrayForeach : IteratorStatement + { TemporaryVariableReference[] lengths; Expression [] length_exprs; StatementExpression[] counter; TemporaryVariableReference[] variables; TemporaryVariableReference copy; - Expression access; - LocalVariableReference variable; public ArrayForeach (Foreach @foreach, int rank) + : base (@foreach) { - for_each = @foreach; - statement = for_each.statement; - loc = @foreach.loc; - counter = new StatementExpression[rank]; variables = new TemporaryVariableReference[rank]; length_exprs = new Expression [rank]; @@ -5663,11 +5900,6 @@ namespace Mono.CSharp { lengths = new TemporaryVariableReference [rank]; } - protected override void CloneTo (CloneContext clonectx, Statement target) - { - throw new NotImplementedException (); - } - public override bool Resolve (BlockContext ec) { Block variables_block = for_each.variable.Block; @@ -5679,7 +5911,7 @@ namespace Mono.CSharp { for (int i = 0; i < rank; i++) { var v = TemporaryVariableReference.Create (ec.BuiltinTypes.Int, variables_block, loc); variables[i] = v; - counter[i] = new StatementExpression (new UnaryMutator (UnaryMutator.Mode.PostIncrement, v, loc)); + counter[i] = new StatementExpression (new UnaryMutator (UnaryMutator.Mode.PostIncrement, v, Location.Null)); counter[i].Resolve (ec); if (rank == 1) { @@ -5696,7 +5928,7 @@ namespace Mono.CSharp { list.Add (new Argument (v)); } - access = new ElementAccess (copy, list, loc).Resolve (ec); + var access = new ElementAccess (copy, list, loc).Resolve (ec); if (access == null) return false; @@ -5706,26 +5938,30 @@ namespace Mono.CSharp { var_type = access.Type; } else { var_type = for_each.type.ResolveAsType (ec); + + if (var_type == null) + return false; + + access = Convert.ExplicitConversion (ec, access, var_type, loc); + if (access == null) + return false; } - if (var_type == null) - return false; + for_each.variable.Type = var_type; - conv = Convert.ExplicitConversion (ec, access, var_type, loc); - if (conv == null) + var variable_ref = new LocalVariableReference (for_each.variable, loc).Resolve (ec); + if (variable_ref == null) return false; + for_each.body.AddScopeStatement (new StatementExpression (new CompilerAssign (variable_ref, access, Location.Null), for_each.variable.Location)); + bool ok = true; ec.StartFlowBranching (FlowBranching.BranchingType.Loop, loc); ec.CurrentBranching.CreateSibling (); - for_each.variable.Type = conv.Type; - variable = new LocalVariableReference (for_each.variable, loc); - variable.Resolve (ec); - ec.StartFlowBranching (FlowBranching.BranchingType.Embedded, loc); - if (!statement.Resolve (ec)) + if (!for_each.body.Resolve (ec)) ok = false; ec.EndFlowBranching (); @@ -5761,12 +5997,10 @@ namespace Mono.CSharp { ec.MarkLabel (loop [i]); } - variable.local_info.CreateBuilder (ec); - variable.EmitAssign (ec, conv, false, false); - - statement.Emit (ec); + for_each.body.Emit (ec); ec.MarkLabel (ec.LoopBegin); + ec.Mark (for_each.expr.Location); for (int i = rank - 1; i >= 0; i--){ counter [i].Emit (ec); @@ -5786,59 +6020,8 @@ namespace Mono.CSharp { } } - sealed class CollectionForeach : Statement, OverloadResolver.IErrorHandler + sealed class CollectionForeach : IteratorStatement, OverloadResolver.IErrorHandler { - class Body : Statement - { - TypeSpec type; - LocalVariableReference variable; - Expression current, conv; - Statement statement; - - public Body (TypeSpec type, LocalVariable variable, - Expression current, Statement statement, - Location loc) - { - this.type = type; - this.variable = new LocalVariableReference (variable, loc); - this.current = current; - this.statement = statement; - this.loc = loc; - } - - protected override void CloneTo (CloneContext clonectx, Statement target) - { - throw new NotImplementedException (); - } - - public override bool Resolve (BlockContext ec) - { - current = current.Resolve (ec); - if (current == null) - return false; - - conv = Convert.ExplicitConversion (ec, current, type, loc); - if (conv == null) - return false; - - variable.local_info.Type = conv.Type; - variable.Resolve (ec); - - if (!statement.Resolve (ec)) - return false; - - return true; - } - - protected override void DoEmit (EmitContext ec) - { - variable.local_info.CreateBuilder (ec); - variable.EmitAssign (ec, conv, false, false); - - statement.Emit (ec); - } - } - class RuntimeDispose : Using.VariableDeclaration { public RuntimeDispose (LocalVariable lv, Location loc) @@ -5881,23 +6064,15 @@ namespace Mono.CSharp { LocalVariable variable; Expression expr; Statement statement; - Expression var_type; ExpressionStatement init; TemporaryVariableReference enumerator_variable; bool ambiguous_getenumerator_name; - public CollectionForeach (Expression var_type, LocalVariable var, Expression expr, Statement stmt, Location l) + public CollectionForeach (Foreach @foreach, LocalVariable var, Expression expr) + : base (@foreach) { - this.var_type = var_type; this.variable = var; this.expr = expr; - statement = stmt; - loc = l; - } - - protected override void CloneTo (CloneContext clonectx, Statement target) - { - throw new NotImplementedException (); } void Error_WrongEnumerator (ResolveContext rc, MethodSpec enumerator) @@ -6059,7 +6234,7 @@ namespace Mono.CSharp { if (current_pe == null) return false; - VarExpr ve = var_type as VarExpr; + VarExpr ve = for_each.type as VarExpr; if (ve != null) { if (is_dynamic) { @@ -6075,16 +6250,26 @@ namespace Mono.CSharp { current_pe = EmptyCast.Create (current_pe, ec.BuiltinTypes.Dynamic); } - variable.Type = var_type.ResolveAsType (ec); + variable.Type = for_each.type.ResolveAsType (ec); + + if (variable.Type == null) + return false; + + current_pe = Convert.ExplicitConversion (ec, current_pe, variable.Type, loc); + if (current_pe == null) + return false; } - if (variable.Type == null) + var variable_ref = new LocalVariableReference (variable, loc).Resolve (ec); + if (variable_ref == null) return false; + for_each.body.AddScopeStatement (new StatementExpression (new CompilerAssign (variable_ref, current_pe, Location.Null), variable.Location)); + var init = new Invocation (get_enumerator_mg, null); statement = new While (new BooleanExpression (new Invocation (move_next_mg, null)), - new Body (variable.Type, variable, current_pe, statement, variable.Location), Location.Null); + for_each.body, Location.Null); var enum_type = enumerator_variable.Type; @@ -6164,13 +6349,15 @@ namespace Mono.CSharp { LocalVariable variable; Expression expr; Statement statement; + Block body; - public Foreach (Expression type, LocalVariable var, Expression expr, Statement stmt, Location l) + public Foreach (Expression type, LocalVariable var, Expression expr, Statement stmt, Block body, Location l) { this.type = type; this.variable = var; this.expr = expr; - statement = stmt; + this.statement = stmt; + this.body = body; loc = l; } @@ -6190,7 +6377,6 @@ namespace Mono.CSharp { get { return variable; } } - public override bool Resolve (BlockContext ec) { expr = expr.Resolve (ec); @@ -6202,6 +6388,8 @@ namespace Mono.CSharp { return false; } + body.AddStatement (statement); + if (expr.Type.BuiltinType == BuiltinTypeSpec.Type.String) { statement = new ArrayForeach (this, 1); } else if (expr.Type is ArrayContainer) { @@ -6213,7 +6401,7 @@ namespace Mono.CSharp { return false; } - statement = new CollectionForeach (type, variable, expr, statement, loc); + statement = new CollectionForeach (this, variable, expr); } return statement.Resolve (ec); @@ -6221,6 +6409,8 @@ namespace Mono.CSharp { protected override void DoEmit (EmitContext ec) { + variable.CreateBuilder (ec); + Label old_begin = ec.LoopBegin, old_end = ec.LoopEnd; ec.LoopBegin = ec.DefineLabel (); ec.LoopEnd = ec.DefineLabel (); @@ -6237,6 +6427,7 @@ namespace Mono.CSharp { target.type = type.Clone (clonectx); target.expr = expr.Clone (clonectx); + target.body = (Block) body.Clone (clonectx); target.statement = statement.Clone (clonectx); } diff --git a/src/Libraries/NRefactory/ICSharpCode.NRefactory.CSharp/Parser/mcs/typemanager.cs b/src/Libraries/NRefactory/ICSharpCode.NRefactory.CSharp/Parser/mcs/typemanager.cs index fd56706c12..6eb3fc6e44 100644 --- a/src/Libraries/NRefactory/ICSharpCode.NRefactory.CSharp/Parser/mcs/typemanager.cs +++ b/src/Libraries/NRefactory/ICSharpCode.NRefactory.CSharp/Parser/mcs/typemanager.cs @@ -228,6 +228,9 @@ namespace Mono.CSharp public readonly PredefinedType Action; public readonly PredefinedType Task; public readonly PredefinedType TaskGeneric; + public readonly PredefinedType IAsyncStateMachine; + public readonly PredefinedType INotifyCompletion; + public readonly PredefinedType ICriticalNotifyCompletion; public PredefinedTypes (ModuleContainer module) { @@ -276,6 +279,9 @@ namespace Mono.CSharp AsyncTaskMethodBuilderGeneric = new PredefinedType (module, MemberKind.Struct, "System.Runtime.CompilerServices", "AsyncTaskMethodBuilder", 1); Task = new PredefinedType (module, MemberKind.Class, "System.Threading.Tasks", "Task"); TaskGeneric = new PredefinedType (module, MemberKind.Class, "System.Threading.Tasks", "Task", 1); + IAsyncStateMachine = new PredefinedType (module, MemberKind.Interface, "System.Runtime.CompilerServices", "IAsyncStateMachine"); + INotifyCompletion = new PredefinedType (module, MemberKind.Interface, "System.Runtime.CompilerServices", "INotifyCompletion"); + ICriticalNotifyCompletion = new PredefinedType (module, MemberKind.Interface, "System.Runtime.CompilerServices", "ICriticalNotifyCompletion"); // // Define types which are used for comparison. It does not matter @@ -312,16 +318,28 @@ namespace Mono.CSharp { public readonly PredefinedMember ActivatorCreateInstance; public readonly PredefinedMember AsyncTaskMethodBuilderCreate; + public readonly PredefinedMember AsyncTaskMethodBuilderStart; public readonly PredefinedMember AsyncTaskMethodBuilderSetResult; public readonly PredefinedMember AsyncTaskMethodBuilderSetException; + public readonly PredefinedMember AsyncTaskMethodBuilderSetStateMachine; + public readonly PredefinedMember AsyncTaskMethodBuilderOnCompleted; + public readonly PredefinedMember AsyncTaskMethodBuilderOnCompletedUnsafe; public readonly PredefinedMember AsyncTaskMethodBuilderTask; public readonly PredefinedMember AsyncTaskMethodBuilderGenericCreate; + public readonly PredefinedMember AsyncTaskMethodBuilderGenericStart; public readonly PredefinedMember AsyncTaskMethodBuilderGenericSetResult; public readonly PredefinedMember AsyncTaskMethodBuilderGenericSetException; + public readonly PredefinedMember AsyncTaskMethodBuilderGenericSetStateMachine; + public readonly PredefinedMember AsyncTaskMethodBuilderGenericOnCompleted; + public readonly PredefinedMember AsyncTaskMethodBuilderGenericOnCompletedUnsafe; public readonly PredefinedMember AsyncTaskMethodBuilderGenericTask; public readonly PredefinedMember AsyncVoidMethodBuilderCreate; + public readonly PredefinedMember AsyncVoidMethodBuilderStart; public readonly PredefinedMember AsyncVoidMethodBuilderSetException; public readonly PredefinedMember AsyncVoidMethodBuilderSetResult; + public readonly PredefinedMember AsyncVoidMethodBuilderSetStateMachine; + public readonly PredefinedMember AsyncVoidMethodBuilderOnCompleted; + public readonly PredefinedMember AsyncVoidMethodBuilderOnCompletedUnsafe; public readonly PredefinedMember DebuggerBrowsableAttributeCtor; public readonly PredefinedMember DecimalCtor; public readonly PredefinedMember DecimalCtorInt; @@ -363,6 +381,8 @@ namespace Mono.CSharp var atypes = module.PredefinedAttributes; var btypes = module.Compiler.BuiltinTypes; + var tp = new TypeParameter (0, new MemberName ("T"), null, null, Variance.None); + ActivatorCreateInstance = new PredefinedMember (module, types.Activator, MemberFilter.Method ("CreateInstance", 1, ParametersCompiled.EmptyReadOnlyParameters, null)); @@ -372,10 +392,52 @@ namespace Mono.CSharp AsyncTaskMethodBuilderSetResult = new PredefinedMember (module, types.AsyncTaskMethodBuilder, MemberFilter.Method ("SetResult", 0, ParametersCompiled.EmptyReadOnlyParameters, btypes.Void)); + AsyncTaskMethodBuilderSetStateMachine = new PredefinedMember (module, types.AsyncTaskMethodBuilder, + "SetStateMachine", MemberKind.Method, () => new[] { + types.IAsyncStateMachine.TypeSpec + }, btypes.Void); + AsyncTaskMethodBuilderSetException = new PredefinedMember (module, types.AsyncTaskMethodBuilder, MemberFilter.Method ("SetException", 0, ParametersCompiled.CreateFullyResolved (btypes.Exception), btypes.Void)); + AsyncTaskMethodBuilderOnCompleted = new PredefinedMember (module, types.AsyncTaskMethodBuilder, + MemberFilter.Method ("AwaitOnCompleted", 2, + new ParametersImported ( + new[] { + new ParameterData (null, Parameter.Modifier.REF), + new ParameterData (null, Parameter.Modifier.REF) + }, + new[] { + new TypeParameterSpec (0, tp, SpecialConstraint.None, Variance.None, null), + new TypeParameterSpec (1, tp, SpecialConstraint.None, Variance.None, null) + }, false), + btypes.Void)); + + AsyncTaskMethodBuilderOnCompletedUnsafe = new PredefinedMember (module, types.AsyncTaskMethodBuilder, + MemberFilter.Method ("AwaitUnsafeOnCompleted", 2, + new ParametersImported ( + new[] { + new ParameterData (null, Parameter.Modifier.REF), + new ParameterData (null, Parameter.Modifier.REF) + }, + new[] { + new TypeParameterSpec (0, tp, SpecialConstraint.None, Variance.None, null), + new TypeParameterSpec (1, tp, SpecialConstraint.None, Variance.None, null) + }, false), + btypes.Void)); + + AsyncTaskMethodBuilderStart = new PredefinedMember (module, types.AsyncTaskMethodBuilder, + MemberFilter.Method ("Start", 1, + new ParametersImported ( + new[] { + new ParameterData (null, Parameter.Modifier.REF), + }, + new[] { + new TypeParameterSpec (0, tp, SpecialConstraint.None, Variance.None, null), + }, false), + btypes.Void)); + AsyncTaskMethodBuilderTask = new PredefinedMember (module, types.AsyncTaskMethodBuilder, MemberFilter.Property ("Task", null)); @@ -385,12 +447,54 @@ namespace Mono.CSharp AsyncTaskMethodBuilderGenericSetResult = new PredefinedMember (module, types.AsyncTaskMethodBuilderGeneric, "SetResult", MemberKind.Method, () => new TypeSpec[] { types.AsyncTaskMethodBuilderGeneric.TypeSpec.MemberDefinition.TypeParameters[0] - }); + }, btypes.Void); + + AsyncTaskMethodBuilderGenericSetStateMachine = new PredefinedMember (module, types.AsyncTaskMethodBuilderGeneric, + "SetStateMachine", MemberKind.Method, () => new[] { + types.IAsyncStateMachine.TypeSpec + }, btypes.Void); AsyncTaskMethodBuilderGenericSetException = new PredefinedMember (module, types.AsyncTaskMethodBuilderGeneric, MemberFilter.Method ("SetException", 0, ParametersCompiled.CreateFullyResolved (btypes.Exception), btypes.Void)); + AsyncTaskMethodBuilderGenericOnCompleted = new PredefinedMember (module, types.AsyncTaskMethodBuilderGeneric, + MemberFilter.Method ("AwaitOnCompleted", 2, + new ParametersImported ( + new[] { + new ParameterData (null, Parameter.Modifier.REF), + new ParameterData (null, Parameter.Modifier.REF) + }, + new[] { + new TypeParameterSpec (0, tp, SpecialConstraint.None, Variance.None, null), + new TypeParameterSpec (1, tp, SpecialConstraint.None, Variance.None, null) + }, false), + btypes.Void)); + + AsyncTaskMethodBuilderGenericOnCompletedUnsafe = new PredefinedMember (module, types.AsyncTaskMethodBuilderGeneric, + MemberFilter.Method ("AwaitUnsafeOnCompleted", 2, + new ParametersImported ( + new[] { + new ParameterData (null, Parameter.Modifier.REF), + new ParameterData (null, Parameter.Modifier.REF) + }, + new[] { + new TypeParameterSpec (0, tp, SpecialConstraint.None, Variance.None, null), + new TypeParameterSpec (1, tp, SpecialConstraint.None, Variance.None, null) + }, false), + btypes.Void)); + + AsyncTaskMethodBuilderGenericStart = new PredefinedMember (module, types.AsyncTaskMethodBuilderGeneric, + MemberFilter.Method ("Start", 1, + new ParametersImported ( + new[] { + new ParameterData (null, Parameter.Modifier.REF), + }, + new[] { + new TypeParameterSpec (0, tp, SpecialConstraint.None, Variance.None, null), + }, false), + btypes.Void)); + AsyncTaskMethodBuilderGenericTask = new PredefinedMember (module, types.AsyncTaskMethodBuilderGeneric, MemberFilter.Property ("Task", null)); @@ -403,6 +507,48 @@ namespace Mono.CSharp AsyncVoidMethodBuilderSetResult = new PredefinedMember (module, types.AsyncVoidMethodBuilder, MemberFilter.Method ("SetResult", 0, ParametersCompiled.EmptyReadOnlyParameters, btypes.Void)); + AsyncVoidMethodBuilderSetStateMachine = new PredefinedMember (module, types.AsyncVoidMethodBuilder, + "SetStateMachine", MemberKind.Method, () => new[] { + types.IAsyncStateMachine.TypeSpec + }, btypes.Void); + + AsyncVoidMethodBuilderOnCompleted = new PredefinedMember (module, types.AsyncVoidMethodBuilder, + MemberFilter.Method ("AwaitOnCompleted", 2, + new ParametersImported ( + new[] { + new ParameterData (null, Parameter.Modifier.REF), + new ParameterData (null, Parameter.Modifier.REF) + }, + new[] { + new TypeParameterSpec (0, tp, SpecialConstraint.None, Variance.None, null), + new TypeParameterSpec (1, tp, SpecialConstraint.None, Variance.None, null) + }, false), + btypes.Void)); + + AsyncVoidMethodBuilderOnCompletedUnsafe = new PredefinedMember (module, types.AsyncVoidMethodBuilder, + MemberFilter.Method ("AwaitUnsafeOnCompleted", 2, + new ParametersImported ( + new[] { + new ParameterData (null, Parameter.Modifier.REF), + new ParameterData (null, Parameter.Modifier.REF) + }, + new[] { + new TypeParameterSpec (0, tp, SpecialConstraint.None, Variance.None, null), + new TypeParameterSpec (1, tp, SpecialConstraint.None, Variance.None, null) + }, false), + btypes.Void)); + + AsyncVoidMethodBuilderStart = new PredefinedMember (module, types.AsyncVoidMethodBuilder, + MemberFilter.Method ("Start", 1, + new ParametersImported ( + new[] { + new ParameterData (null, Parameter.Modifier.REF), + }, + new[] { + new TypeParameterSpec (0, tp, SpecialConstraint.None, Variance.None, null), + }, false), + btypes.Void)); + DebuggerBrowsableAttributeCtor = new PredefinedMember (module, atypes.DebuggerBrowsable, MemberFilter.Constructor (null)); @@ -464,7 +610,6 @@ namespace Mono.CSharp false), btypes.Int)); - var tp = new TypeParameter(0, new MemberName("T"), null, null, Variance.None); InterlockedCompareExchange_T = new PredefinedMember (module, types.Interlocked, MemberFilter.Method ("CompareExchange", 1, new ParametersImported ( @@ -743,8 +888,8 @@ namespace Mono.CSharp }; } - public PredefinedMember (ModuleContainer module, PredefinedType type, string name, MemberKind kind, Func typesBuilder) - : this (module, type, new MemberFilter (name, 0, kind, null, null)) + public PredefinedMember (ModuleContainer module, PredefinedType type, string name, MemberKind kind, Func typesBuilder, TypeSpec returnType) + : this (module, type, new MemberFilter (name, 0, kind, null, returnType)) { filter_builder = typesBuilder; } diff --git a/src/Libraries/NRefactory/ICSharpCode.NRefactory.CSharp/Parser/mcs/typespec.cs b/src/Libraries/NRefactory/ICSharpCode.NRefactory.CSharp/Parser/mcs/typespec.cs index c0df802c85..7ad55a4be4 100644 --- a/src/Libraries/NRefactory/ICSharpCode.NRefactory.CSharp/Parser/mcs/typespec.cs +++ b/src/Libraries/NRefactory/ICSharpCode.NRefactory.CSharp/Parser/mcs/typespec.cs @@ -1061,8 +1061,7 @@ namespace Mono.CSharp if (!IsEqual (a.Types[i], b.Types[i])) return false; - const Parameter.Modifier ref_out = Parameter.Modifier.REF | Parameter.Modifier.OUT; - if ((a.FixedParameters[i].ModFlags & ref_out) != (b.FixedParameters[i].ModFlags & ref_out)) + if ((a.FixedParameters[i].ModFlags & Parameter.Modifier.RefOutMask) != (b.FixedParameters[i].ModFlags & Parameter.Modifier.RefOutMask)) return false; } diff --git a/src/Libraries/NRefactory/ICSharpCode.NRefactory.CSharp/Parser/mcs/visit.cs b/src/Libraries/NRefactory/ICSharpCode.NRefactory.CSharp/Parser/mcs/visit.cs index dee9e798d9..dbd5709aaf 100644 --- a/src/Libraries/NRefactory/ICSharpCode.NRefactory.CSharp/Parser/mcs/visit.cs +++ b/src/Libraries/NRefactory/ICSharpCode.NRefactory.CSharp/Parser/mcs/visit.cs @@ -2,7 +2,7 @@ // visit.cs: Visitors for parsed dom // // Authors: Mike Krüger (mkrueger@novell.com) -// Marek Safar (marek.safar@gmail.com) +// Marek Safar (marek.safar@gmail.com) // // Dual licensed under the terms of the MIT X11 or GNU GPL // @@ -26,16 +26,15 @@ namespace Mono.CSharp foreach (var container in mc.Containers) { container.Accept (this); } - } void VisitTypeDefinition (TypeDefinition tc) { - foreach (var container in tc.Members) { - container.Accept (this); + foreach (var member in tc.Members) { + member.Accept (this); } } - + public virtual void Visit (NamespaceContainer ns) { } diff --git a/src/Libraries/NRefactory/ICSharpCode.NRefactory.CSharp/Refactoring/BaseRefactoringContext.cs b/src/Libraries/NRefactory/ICSharpCode.NRefactory.CSharp/Refactoring/BaseRefactoringContext.cs index 242c9c3b9d..449be597dc 100644 --- a/src/Libraries/NRefactory/ICSharpCode.NRefactory.CSharp/Refactoring/BaseRefactoringContext.cs +++ b/src/Libraries/NRefactory/ICSharpCode.NRefactory.CSharp/Refactoring/BaseRefactoringContext.cs @@ -34,12 +34,13 @@ using ICSharpCode.NRefactory.TypeSystem; using ICSharpCode.NRefactory.TypeSystem.Implementation; using ICSharpCode.NRefactory.Editor; using System.ComponentModel.Design; +using ICSharpCode.NRefactory.CSharp.Analysis; namespace ICSharpCode.NRefactory.CSharp.Refactoring { public abstract class BaseRefactoringContext : IServiceProvider { - protected readonly CSharpAstResolver resolver; + readonly CSharpAstResolver resolver; readonly CancellationToken cancellationToken; public virtual bool Supports(Version version) @@ -65,6 +66,12 @@ namespace ICSharpCode.NRefactory.CSharp.Refactoring } } + public CSharpAstResolver Resolver { + get { + return resolver; + } + } + public virtual CSharpParsedFile ParsedFile { get { return resolver.ParsedFile; @@ -113,7 +120,23 @@ namespace ICSharpCode.NRefactory.CSharp.Refactoring return resolver.GetConversion(expression, cancellationToken); } #endregion - + + #region Code Analyzation + /// + /// Creates a new definite assignment analysis object with a given root statement. + /// + /// + /// The definite assignment analysis object. + /// + /// + /// The root statement. + /// + public DefiniteAssignmentAnalysis CreateDefiniteAssignmentAnalysis (Statement root) + { + return new DefiniteAssignmentAnalysis (root, resolver, CancellationToken); + } + #endregion + /// /// Translates the english input string to the context language. /// diff --git a/src/Libraries/NRefactory/ICSharpCode.NRefactory.CSharp/Refactoring/CodeAction.cs b/src/Libraries/NRefactory/ICSharpCode.NRefactory.CSharp/Refactoring/CodeAction.cs index 776cc5726d..3bc59be60d 100644 --- a/src/Libraries/NRefactory/ICSharpCode.NRefactory.CSharp/Refactoring/CodeAction.cs +++ b/src/Libraries/NRefactory/ICSharpCode.NRefactory.CSharp/Refactoring/CodeAction.cs @@ -27,18 +27,36 @@ using System; namespace ICSharpCode.NRefactory.CSharp.Refactoring { + /// + /// A code action provides a code transformation with a description. + /// public class CodeAction { + /// + /// Gets the description. + /// public string Description { get; private set; } + /// + /// Gets the code transformation. + /// public Action