diff --git a/rewrite-hcl/src/main/antlr/HCLParser.g4 b/rewrite-hcl/src/main/antlr/HCLParser.g4 index aa2618baa00..5d48086569c 100644 --- a/rewrite-hcl/src/main/antlr/HCLParser.g4 +++ b/rewrite-hcl/src/main/antlr/HCLParser.g4 @@ -52,6 +52,7 @@ exprTerm | functionCall #FunctionCallExpression | exprTerm index #IndexAccessExpression | exprTerm getAttr #AttributeAccessExpression + | exprTerm legacyIndexAttr #LegacyIndexAttributeExpression | exprTerm splat #SplatExpression | LPAREN expression RPAREN #ParentheticalExpression ; @@ -144,6 +145,14 @@ getAttr : DOT Identifier ; +// Legacy Index Access Operator +// https://github.com/hashicorp/hcl/blob/923b06b5d6adf61a647101c605f7463a1bd56cbf/hclsyntax/spec.md#L547 +// Interestingly not mentioned in hcl2 syntax specification anymore + +legacyIndexAttr + : DOT NumericLiteral + ; + // Splat Operators // https://github.com/hashicorp/hcl2/blob/master/hcl/hclsyntax/spec.md#splat-operators diff --git a/rewrite-hcl/src/main/java/org/openrewrite/hcl/HclIsoVisitor.java b/rewrite-hcl/src/main/java/org/openrewrite/hcl/HclIsoVisitor.java index 6f5b3d2ceb9..b442182a944 100644 --- a/rewrite-hcl/src/main/java/org/openrewrite/hcl/HclIsoVisitor.java +++ b/rewrite-hcl/src/main/java/org/openrewrite/hcl/HclIsoVisitor.java @@ -102,6 +102,11 @@ public Hcl.Index.Position visitIndexPosition(Hcl.Index.Position indexPosition, P return (Hcl.Index.Position) super.visitIndexPosition(indexPosition, p); } + @Override + public Hcl.LegacyIndexAttributeAccess visitLegacyIndexAttribute(Hcl.LegacyIndexAttributeAccess legacyIndexAttributeAccess, P p) { + return (Hcl.LegacyIndexAttributeAccess) super.visitLegacyIndexAttribute(legacyIndexAttributeAccess, p); + } + @Override public Hcl.Literal visitLiteral(Hcl.Literal literal, P p) { return (Hcl.Literal) super.visitLiteral(literal, p); diff --git a/rewrite-hcl/src/main/java/org/openrewrite/hcl/HclVisitor.java b/rewrite-hcl/src/main/java/org/openrewrite/hcl/HclVisitor.java index 6c7d095e00a..c16f141f311 100644 --- a/rewrite-hcl/src/main/java/org/openrewrite/hcl/HclVisitor.java +++ b/rewrite-hcl/src/main/java/org/openrewrite/hcl/HclVisitor.java @@ -77,6 +77,22 @@ public Hcl visitAttributeAccess(Hcl.AttributeAccess attributeAccess, P p) { return a; } + public Hcl visitLegacyIndexAttribute(Hcl.LegacyIndexAttributeAccess legacyIndexAttributeAccess, P p) { + Hcl.LegacyIndexAttributeAccess li = legacyIndexAttributeAccess; + li = li.withPrefix(visitSpace(li.getPrefix(), Space.Location.ATTRIBUTE_ACCESS, p)); + li = li.withMarkers(visitMarkers(li.getMarkers(), p)); + Expression temp = (Expression) visitExpression(li, p); + if (!(temp instanceof Hcl.LegacyIndexAttributeAccess)) { + return temp; + } else { + li = (Hcl.LegacyIndexAttributeAccess) temp; + } + li = li.withBase((Expression) visit(li.getBase(), p)); + li = li.withIndex(li.getIndex()); + return li; + } + + public Hcl visitBinary(Hcl.Binary binary, P p) { Hcl.Binary b = binary; b = b.withPrefix(visitSpace(b.getPrefix(), Space.Location.BINARY, p)); diff --git a/rewrite-hcl/src/main/java/org/openrewrite/hcl/internal/HclParserVisitor.java b/rewrite-hcl/src/main/java/org/openrewrite/hcl/internal/HclParserVisitor.java index 00aa2b37f4f..7d1ea367d6e 100644 --- a/rewrite-hcl/src/main/java/org/openrewrite/hcl/internal/HclParserVisitor.java +++ b/rewrite-hcl/src/main/java/org/openrewrite/hcl/internal/HclParserVisitor.java @@ -409,6 +409,17 @@ public Hcl visitIndexAccessExpression(HCLParser.IndexAccessExpressionContext ctx )); } + @Override + public Hcl visitLegacyIndexAttributeExpression(HCLParser.LegacyIndexAttributeExpressionContext ctx) { + return convert(ctx, (c, prefix) -> new Hcl.LegacyIndexAttributeAccess( + randomId(), + Space.format(prefix), + Markers.EMPTY, + (Expression) visit(c.exprTerm()), + c.legacyIndexAttr().NumericLiteral().getText() + )); + } + @Override public Hcl visitLiteralValue(HCLParser.LiteralValueContext ctx) { return convert(ctx, (c, prefix) -> { diff --git a/rewrite-hcl/src/main/java/org/openrewrite/hcl/internal/HclPrinter.java b/rewrite-hcl/src/main/java/org/openrewrite/hcl/internal/HclPrinter.java index 125040cbc4f..a3a40095c18 100644 --- a/rewrite-hcl/src/main/java/org/openrewrite/hcl/internal/HclPrinter.java +++ b/rewrite-hcl/src/main/java/org/openrewrite/hcl/internal/HclPrinter.java @@ -288,6 +288,16 @@ public Hcl visitIndexPosition(Hcl.Index.Position indexPosition, PrintOutputCaptu return indexPosition; } + @Override + public Hcl visitLegacyIndexAttribute(Hcl.LegacyIndexAttributeAccess laccess, PrintOutputCapture

p) { + beforeSyntax(laccess, Space.Location.ATTRIBUTE_ACCESS, p); + visit(laccess.getBase(), p); + p.append("."); + p.append(laccess.getIndex()); + afterSyntax(laccess, p); + return laccess; + } + @Override public Hcl visitLiteral(Hcl.Literal literal, PrintOutputCapture

p) { beforeSyntax(literal, Space.Location.LITERAL, p); diff --git a/rewrite-hcl/src/main/java/org/openrewrite/hcl/internal/grammar/HCLParser.interp b/rewrite-hcl/src/main/java/org/openrewrite/hcl/internal/grammar/HCLParser.interp index 20b2b39e3b0..b80f4f5904d 100644 --- a/rewrite-hcl/src/main/java/org/openrewrite/hcl/internal/grammar/HCLParser.interp +++ b/rewrite-hcl/src/main/java/org/openrewrite/hcl/internal/grammar/HCLParser.interp @@ -123,6 +123,7 @@ functionCall arguments index getAttr +legacyIndexAttr splat attrSplat fullSplat @@ -142,4 +143,4 @@ templateInterpolation atn: -[4, 1, 47, 362, 2, 0, 7, 0, 2, 1, 7, 1, 2, 2, 7, 2, 2, 3, 7, 3, 2, 4, 7, 4, 2, 5, 7, 5, 2, 6, 7, 6, 2, 7, 7, 7, 2, 8, 7, 8, 2, 9, 7, 9, 2, 10, 7, 10, 2, 11, 7, 11, 2, 12, 7, 12, 2, 13, 7, 13, 2, 14, 7, 14, 2, 15, 7, 15, 2, 16, 7, 16, 2, 17, 7, 17, 2, 18, 7, 18, 2, 19, 7, 19, 2, 20, 7, 20, 2, 21, 7, 21, 2, 22, 7, 22, 2, 23, 7, 23, 2, 24, 7, 24, 2, 25, 7, 25, 2, 26, 7, 26, 2, 27, 7, 27, 2, 28, 7, 28, 2, 29, 7, 29, 2, 30, 7, 30, 2, 31, 7, 31, 2, 32, 7, 32, 2, 33, 7, 33, 2, 34, 7, 34, 2, 35, 7, 35, 2, 36, 7, 36, 2, 37, 7, 37, 2, 38, 7, 38, 2, 39, 7, 39, 1, 0, 1, 0, 1, 1, 5, 1, 84, 8, 1, 10, 1, 12, 1, 87, 9, 1, 1, 2, 1, 2, 3, 2, 91, 8, 2, 1, 3, 1, 3, 1, 3, 1, 3, 1, 4, 1, 4, 5, 4, 99, 8, 4, 10, 4, 12, 4, 102, 9, 4, 1, 4, 1, 4, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 3, 5, 111, 8, 5, 1, 6, 1, 6, 1, 6, 3, 6, 116, 8, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 5, 6, 124, 8, 6, 10, 6, 12, 6, 127, 9, 6, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 3, 7, 140, 8, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 5, 7, 148, 8, 7, 10, 7, 12, 7, 151, 9, 7, 1, 8, 1, 8, 1, 8, 1, 8, 1, 9, 1, 9, 1, 10, 1, 10, 3, 10, 161, 8, 10, 1, 11, 1, 11, 1, 11, 1, 11, 5, 11, 167, 8, 11, 10, 11, 12, 11, 170, 9, 11, 1, 11, 3, 11, 173, 8, 11, 3, 11, 175, 8, 11, 1, 11, 1, 11, 1, 12, 1, 12, 5, 12, 181, 8, 12, 10, 12, 12, 12, 184, 9, 12, 1, 12, 1, 12, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 5, 13, 194, 8, 13, 10, 13, 12, 13, 197, 9, 13, 1, 13, 1, 13, 3, 13, 201, 8, 13, 1, 13, 1, 13, 1, 13, 3, 13, 206, 8, 13, 1, 14, 1, 14, 3, 14, 210, 8, 14, 1, 15, 1, 15, 1, 15, 1, 15, 1, 15, 3, 15, 217, 8, 15, 1, 15, 1, 15, 1, 16, 1, 16, 1, 16, 1, 16, 1, 16, 1, 16, 1, 16, 3, 16, 228, 8, 16, 1, 16, 3, 16, 231, 8, 16, 1, 16, 1, 16, 1, 17, 1, 17, 1, 17, 3, 17, 238, 8, 17, 1, 17, 1, 17, 1, 17, 1, 18, 1, 18, 1, 18, 1, 19, 1, 19, 1, 20, 1, 20, 1, 20, 3, 20, 251, 8, 20, 1, 20, 1, 20, 1, 21, 1, 21, 1, 21, 5, 21, 258, 8, 21, 10, 21, 12, 21, 261, 9, 21, 1, 21, 3, 21, 264, 8, 21, 1, 22, 1, 22, 1, 22, 1, 22, 1, 23, 1, 23, 1, 23, 1, 24, 1, 24, 3, 24, 275, 8, 24, 1, 25, 1, 25, 1, 25, 5, 25, 280, 8, 25, 10, 25, 12, 25, 283, 9, 25, 1, 26, 1, 26, 1, 26, 1, 26, 1, 26, 5, 26, 290, 8, 26, 10, 26, 12, 26, 293, 9, 26, 1, 27, 1, 27, 3, 27, 297, 8, 27, 1, 28, 1, 28, 1, 28, 1, 29, 1, 29, 3, 29, 304, 8, 29, 1, 29, 1, 29, 1, 29, 3, 29, 309, 8, 29, 1, 30, 1, 30, 1, 30, 3, 30, 314, 8, 30, 1, 31, 1, 31, 1, 32, 1, 32, 1, 33, 1, 33, 1, 34, 1, 34, 1, 34, 1, 34, 5, 34, 326, 8, 34, 10, 34, 12, 34, 329, 9, 34, 4, 34, 331, 8, 34, 11, 34, 12, 34, 332, 1, 34, 1, 34, 1, 34, 5, 34, 338, 8, 34, 10, 34, 12, 34, 341, 9, 34, 1, 34, 3, 34, 344, 8, 34, 1, 35, 1, 35, 3, 35, 348, 8, 35, 1, 36, 1, 36, 1, 37, 1, 37, 3, 37, 354, 8, 37, 1, 38, 1, 38, 1, 39, 1, 39, 1, 39, 1, 39, 1, 39, 0, 2, 12, 14, 40, 0, 2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30, 32, 34, 36, 38, 40, 42, 44, 46, 48, 50, 52, 54, 56, 58, 60, 62, 64, 66, 68, 70, 72, 74, 76, 78, 0, 7, 2, 0, 13, 14, 16, 16, 2, 0, 7, 7, 22, 22, 2, 0, 39, 39, 41, 41, 2, 0, 25, 25, 33, 33, 4, 0, 20, 21, 27, 28, 34, 34, 37, 37, 5, 0, 18, 18, 25, 25, 32, 32, 36, 36, 40, 40, 2, 0, 19, 19, 26, 26, 369, 0, 80, 1, 0, 0, 0, 2, 85, 1, 0, 0, 0, 4, 90, 1, 0, 0, 0, 6, 92, 1, 0, 0, 0, 8, 96, 1, 0, 0, 0, 10, 110, 1, 0, 0, 0, 12, 115, 1, 0, 0, 0, 14, 139, 1, 0, 0, 0, 16, 152, 1, 0, 0, 0, 18, 156, 1, 0, 0, 0, 20, 160, 1, 0, 0, 0, 22, 162, 1, 0, 0, 0, 24, 178, 1, 0, 0, 0, 26, 200, 1, 0, 0, 0, 28, 209, 1, 0, 0, 0, 30, 211, 1, 0, 0, 0, 32, 220, 1, 0, 0, 0, 34, 234, 1, 0, 0, 0, 36, 242, 1, 0, 0, 0, 38, 245, 1, 0, 0, 0, 40, 247, 1, 0, 0, 0, 42, 254, 1, 0, 0, 0, 44, 265, 1, 0, 0, 0, 46, 269, 1, 0, 0, 0, 48, 274, 1, 0, 0, 0, 50, 276, 1, 0, 0, 0, 52, 284, 1, 0, 0, 0, 54, 296, 1, 0, 0, 0, 56, 298, 1, 0, 0, 0, 58, 303, 1, 0, 0, 0, 60, 313, 1, 0, 0, 0, 62, 315, 1, 0, 0, 0, 64, 317, 1, 0, 0, 0, 66, 319, 1, 0, 0, 0, 68, 343, 1, 0, 0, 0, 70, 347, 1, 0, 0, 0, 72, 349, 1, 0, 0, 0, 74, 353, 1, 0, 0, 0, 76, 355, 1, 0, 0, 0, 78, 357, 1, 0, 0, 0, 80, 81, 3, 2, 1, 0, 81, 1, 1, 0, 0, 0, 82, 84, 3, 4, 2, 0, 83, 82, 1, 0, 0, 0, 84, 87, 1, 0, 0, 0, 85, 83, 1, 0, 0, 0, 85, 86, 1, 0, 0, 0, 86, 3, 1, 0, 0, 0, 87, 85, 1, 0, 0, 0, 88, 91, 3, 6, 3, 0, 89, 91, 3, 8, 4, 0, 90, 88, 1, 0, 0, 0, 90, 89, 1, 0, 0, 0, 91, 5, 1, 0, 0, 0, 92, 93, 5, 8, 0, 0, 93, 94, 5, 7, 0, 0, 94, 95, 3, 12, 6, 0, 95, 7, 1, 0, 0, 0, 96, 100, 5, 8, 0, 0, 97, 99, 3, 10, 5, 0, 98, 97, 1, 0, 0, 0, 99, 102, 1, 0, 0, 0, 100, 98, 1, 0, 0, 0, 100, 101, 1, 0, 0, 0, 101, 103, 1, 0, 0, 0, 102, 100, 1, 0, 0, 0, 103, 104, 3, 16, 8, 0, 104, 9, 1, 0, 0, 0, 105, 106, 5, 15, 0, 0, 106, 107, 3, 76, 38, 0, 107, 108, 5, 15, 0, 0, 108, 111, 1, 0, 0, 0, 109, 111, 5, 8, 0, 0, 110, 105, 1, 0, 0, 0, 110, 109, 1, 0, 0, 0, 111, 11, 1, 0, 0, 0, 112, 113, 6, 6, -1, 0, 113, 116, 3, 14, 7, 0, 114, 116, 3, 54, 27, 0, 115, 112, 1, 0, 0, 0, 115, 114, 1, 0, 0, 0, 116, 125, 1, 0, 0, 0, 117, 118, 10, 1, 0, 0, 118, 119, 5, 29, 0, 0, 119, 120, 3, 12, 6, 0, 120, 121, 5, 22, 0, 0, 121, 122, 3, 12, 6, 2, 122, 124, 1, 0, 0, 0, 123, 117, 1, 0, 0, 0, 124, 127, 1, 0, 0, 0, 125, 123, 1, 0, 0, 0, 125, 126, 1, 0, 0, 0, 126, 13, 1, 0, 0, 0, 127, 125, 1, 0, 0, 0, 128, 129, 6, 7, -1, 0, 129, 140, 3, 68, 34, 0, 130, 140, 3, 18, 9, 0, 131, 140, 3, 28, 14, 0, 132, 140, 3, 20, 10, 0, 133, 140, 3, 38, 19, 0, 134, 140, 3, 40, 20, 0, 135, 136, 5, 24, 0, 0, 136, 137, 3, 12, 6, 0, 137, 138, 5, 31, 0, 0, 138, 140, 1, 0, 0, 0, 139, 128, 1, 0, 0, 0, 139, 130, 1, 0, 0, 0, 139, 131, 1, 0, 0, 0, 139, 132, 1, 0, 0, 0, 139, 133, 1, 0, 0, 0, 139, 134, 1, 0, 0, 0, 139, 135, 1, 0, 0, 0, 140, 149, 1, 0, 0, 0, 141, 142, 10, 4, 0, 0, 142, 148, 3, 44, 22, 0, 143, 144, 10, 3, 0, 0, 144, 148, 3, 46, 23, 0, 145, 146, 10, 2, 0, 0, 146, 148, 3, 48, 24, 0, 147, 141, 1, 0, 0, 0, 147, 143, 1, 0, 0, 0, 147, 145, 1, 0, 0, 0, 148, 151, 1, 0, 0, 0, 149, 147, 1, 0, 0, 0, 149, 150, 1, 0, 0, 0, 150, 15, 1, 0, 0, 0, 151, 149, 1, 0, 0, 0, 152, 153, 5, 5, 0, 0, 153, 154, 3, 2, 1, 0, 154, 155, 5, 6, 0, 0, 155, 17, 1, 0, 0, 0, 156, 157, 7, 0, 0, 0, 157, 19, 1, 0, 0, 0, 158, 161, 3, 22, 11, 0, 159, 161, 3, 24, 12, 0, 160, 158, 1, 0, 0, 0, 160, 159, 1, 0, 0, 0, 161, 21, 1, 0, 0, 0, 162, 174, 5, 23, 0, 0, 163, 168, 3, 12, 6, 0, 164, 165, 5, 39, 0, 0, 165, 167, 3, 12, 6, 0, 166, 164, 1, 0, 0, 0, 167, 170, 1, 0, 0, 0, 168, 166, 1, 0, 0, 0, 168, 169, 1, 0, 0, 0, 169, 172, 1, 0, 0, 0, 170, 168, 1, 0, 0, 0, 171, 173, 5, 39, 0, 0, 172, 171, 1, 0, 0, 0, 172, 173, 1, 0, 0, 0, 173, 175, 1, 0, 0, 0, 174, 163, 1, 0, 0, 0, 174, 175, 1, 0, 0, 0, 175, 176, 1, 0, 0, 0, 176, 177, 5, 30, 0, 0, 177, 23, 1, 0, 0, 0, 178, 182, 5, 5, 0, 0, 179, 181, 3, 26, 13, 0, 180, 179, 1, 0, 0, 0, 181, 184, 1, 0, 0, 0, 182, 180, 1, 0, 0, 0, 182, 183, 1, 0, 0, 0, 183, 185, 1, 0, 0, 0, 184, 182, 1, 0, 0, 0, 185, 186, 5, 6, 0, 0, 186, 25, 1, 0, 0, 0, 187, 201, 5, 8, 0, 0, 188, 189, 5, 24, 0, 0, 189, 190, 5, 8, 0, 0, 190, 201, 5, 31, 0, 0, 191, 195, 5, 15, 0, 0, 192, 194, 3, 74, 37, 0, 193, 192, 1, 0, 0, 0, 194, 197, 1, 0, 0, 0, 195, 193, 1, 0, 0, 0, 195, 196, 1, 0, 0, 0, 196, 198, 1, 0, 0, 0, 197, 195, 1, 0, 0, 0, 198, 201, 5, 15, 0, 0, 199, 201, 3, 12, 6, 0, 200, 187, 1, 0, 0, 0, 200, 188, 1, 0, 0, 0, 200, 191, 1, 0, 0, 0, 200, 199, 1, 0, 0, 0, 201, 202, 1, 0, 0, 0, 202, 203, 7, 1, 0, 0, 203, 205, 3, 12, 6, 0, 204, 206, 5, 39, 0, 0, 205, 204, 1, 0, 0, 0, 205, 206, 1, 0, 0, 0, 206, 27, 1, 0, 0, 0, 207, 210, 3, 30, 15, 0, 208, 210, 3, 32, 16, 0, 209, 207, 1, 0, 0, 0, 209, 208, 1, 0, 0, 0, 210, 29, 1, 0, 0, 0, 211, 212, 5, 2, 0, 0, 212, 213, 3, 34, 17, 0, 213, 214, 5, 22, 0, 0, 214, 216, 3, 12, 6, 0, 215, 217, 3, 36, 18, 0, 216, 215, 1, 0, 0, 0, 216, 217, 1, 0, 0, 0, 217, 218, 1, 0, 0, 0, 218, 219, 5, 30, 0, 0, 219, 31, 1, 0, 0, 0, 220, 221, 5, 1, 0, 0, 221, 222, 3, 34, 17, 0, 222, 223, 5, 22, 0, 0, 223, 224, 3, 12, 6, 0, 224, 225, 5, 38, 0, 0, 225, 227, 3, 12, 6, 0, 226, 228, 5, 41, 0, 0, 227, 226, 1, 0, 0, 0, 227, 228, 1, 0, 0, 0, 228, 230, 1, 0, 0, 0, 229, 231, 3, 36, 18, 0, 230, 229, 1, 0, 0, 0, 230, 231, 1, 0, 0, 0, 231, 232, 1, 0, 0, 0, 232, 233, 5, 6, 0, 0, 233, 33, 1, 0, 0, 0, 234, 237, 5, 8, 0, 0, 235, 236, 5, 39, 0, 0, 236, 238, 5, 8, 0, 0, 237, 235, 1, 0, 0, 0, 237, 238, 1, 0, 0, 0, 238, 239, 1, 0, 0, 0, 239, 240, 5, 4, 0, 0, 240, 241, 3, 12, 6, 0, 241, 35, 1, 0, 0, 0, 242, 243, 5, 3, 0, 0, 243, 244, 3, 12, 6, 0, 244, 37, 1, 0, 0, 0, 245, 246, 5, 8, 0, 0, 246, 39, 1, 0, 0, 0, 247, 248, 5, 8, 0, 0, 248, 250, 5, 24, 0, 0, 249, 251, 3, 42, 21, 0, 250, 249, 1, 0, 0, 0, 250, 251, 1, 0, 0, 0, 251, 252, 1, 0, 0, 0, 252, 253, 5, 31, 0, 0, 253, 41, 1, 0, 0, 0, 254, 259, 3, 12, 6, 0, 255, 256, 5, 39, 0, 0, 256, 258, 3, 12, 6, 0, 257, 255, 1, 0, 0, 0, 258, 261, 1, 0, 0, 0, 259, 257, 1, 0, 0, 0, 259, 260, 1, 0, 0, 0, 260, 263, 1, 0, 0, 0, 261, 259, 1, 0, 0, 0, 262, 264, 7, 2, 0, 0, 263, 262, 1, 0, 0, 0, 263, 264, 1, 0, 0, 0, 264, 43, 1, 0, 0, 0, 265, 266, 5, 23, 0, 0, 266, 267, 3, 12, 6, 0, 267, 268, 5, 30, 0, 0, 268, 45, 1, 0, 0, 0, 269, 270, 5, 35, 0, 0, 270, 271, 5, 8, 0, 0, 271, 47, 1, 0, 0, 0, 272, 275, 3, 50, 25, 0, 273, 275, 3, 52, 26, 0, 274, 272, 1, 0, 0, 0, 274, 273, 1, 0, 0, 0, 275, 49, 1, 0, 0, 0, 276, 277, 5, 35, 0, 0, 277, 281, 5, 32, 0, 0, 278, 280, 3, 46, 23, 0, 279, 278, 1, 0, 0, 0, 280, 283, 1, 0, 0, 0, 281, 279, 1, 0, 0, 0, 281, 282, 1, 0, 0, 0, 282, 51, 1, 0, 0, 0, 283, 281, 1, 0, 0, 0, 284, 285, 5, 23, 0, 0, 285, 286, 5, 32, 0, 0, 286, 291, 5, 30, 0, 0, 287, 290, 3, 46, 23, 0, 288, 290, 3, 44, 22, 0, 289, 287, 1, 0, 0, 0, 289, 288, 1, 0, 0, 0, 290, 293, 1, 0, 0, 0, 291, 289, 1, 0, 0, 0, 291, 292, 1, 0, 0, 0, 292, 53, 1, 0, 0, 0, 293, 291, 1, 0, 0, 0, 294, 297, 3, 56, 28, 0, 295, 297, 3, 58, 29, 0, 296, 294, 1, 0, 0, 0, 296, 295, 1, 0, 0, 0, 297, 55, 1, 0, 0, 0, 298, 299, 7, 3, 0, 0, 299, 300, 3, 14, 7, 0, 300, 57, 1, 0, 0, 0, 301, 304, 3, 14, 7, 0, 302, 304, 3, 56, 28, 0, 303, 301, 1, 0, 0, 0, 303, 302, 1, 0, 0, 0, 304, 305, 1, 0, 0, 0, 305, 308, 3, 60, 30, 0, 306, 309, 3, 14, 7, 0, 307, 309, 3, 54, 27, 0, 308, 306, 1, 0, 0, 0, 308, 307, 1, 0, 0, 0, 309, 59, 1, 0, 0, 0, 310, 314, 3, 62, 31, 0, 311, 314, 3, 64, 32, 0, 312, 314, 3, 66, 33, 0, 313, 310, 1, 0, 0, 0, 313, 311, 1, 0, 0, 0, 313, 312, 1, 0, 0, 0, 314, 61, 1, 0, 0, 0, 315, 316, 7, 4, 0, 0, 316, 63, 1, 0, 0, 0, 317, 318, 7, 5, 0, 0, 318, 65, 1, 0, 0, 0, 319, 320, 7, 6, 0, 0, 320, 67, 1, 0, 0, 0, 321, 322, 5, 17, 0, 0, 322, 330, 5, 8, 0, 0, 323, 327, 5, 12, 0, 0, 324, 326, 3, 70, 35, 0, 325, 324, 1, 0, 0, 0, 326, 329, 1, 0, 0, 0, 327, 325, 1, 0, 0, 0, 327, 328, 1, 0, 0, 0, 328, 331, 1, 0, 0, 0, 329, 327, 1, 0, 0, 0, 330, 323, 1, 0, 0, 0, 331, 332, 1, 0, 0, 0, 332, 330, 1, 0, 0, 0, 332, 333, 1, 0, 0, 0, 333, 334, 1, 0, 0, 0, 334, 344, 5, 8, 0, 0, 335, 339, 5, 15, 0, 0, 336, 338, 3, 74, 37, 0, 337, 336, 1, 0, 0, 0, 338, 341, 1, 0, 0, 0, 339, 337, 1, 0, 0, 0, 339, 340, 1, 0, 0, 0, 340, 342, 1, 0, 0, 0, 341, 339, 1, 0, 0, 0, 342, 344, 5, 15, 0, 0, 343, 321, 1, 0, 0, 0, 343, 335, 1, 0, 0, 0, 344, 69, 1, 0, 0, 0, 345, 348, 3, 78, 39, 0, 346, 348, 3, 72, 36, 0, 347, 345, 1, 0, 0, 0, 347, 346, 1, 0, 0, 0, 348, 71, 1, 0, 0, 0, 349, 350, 5, 46, 0, 0, 350, 73, 1, 0, 0, 0, 351, 354, 3, 78, 39, 0, 352, 354, 3, 76, 38, 0, 353, 351, 1, 0, 0, 0, 353, 352, 1, 0, 0, 0, 354, 75, 1, 0, 0, 0, 355, 356, 5, 44, 0, 0, 356, 77, 1, 0, 0, 0, 357, 358, 5, 43, 0, 0, 358, 359, 3, 12, 6, 0, 359, 360, 5, 6, 0, 0, 360, 79, 1, 0, 0, 0, 39, 85, 90, 100, 110, 115, 125, 139, 147, 149, 160, 168, 172, 174, 182, 195, 200, 205, 209, 216, 227, 230, 237, 250, 259, 263, 274, 281, 289, 291, 296, 303, 308, 313, 327, 332, 339, 343, 347, 353] \ No newline at end of file +[4, 1, 47, 369, 2, 0, 7, 0, 2, 1, 7, 1, 2, 2, 7, 2, 2, 3, 7, 3, 2, 4, 7, 4, 2, 5, 7, 5, 2, 6, 7, 6, 2, 7, 7, 7, 2, 8, 7, 8, 2, 9, 7, 9, 2, 10, 7, 10, 2, 11, 7, 11, 2, 12, 7, 12, 2, 13, 7, 13, 2, 14, 7, 14, 2, 15, 7, 15, 2, 16, 7, 16, 2, 17, 7, 17, 2, 18, 7, 18, 2, 19, 7, 19, 2, 20, 7, 20, 2, 21, 7, 21, 2, 22, 7, 22, 2, 23, 7, 23, 2, 24, 7, 24, 2, 25, 7, 25, 2, 26, 7, 26, 2, 27, 7, 27, 2, 28, 7, 28, 2, 29, 7, 29, 2, 30, 7, 30, 2, 31, 7, 31, 2, 32, 7, 32, 2, 33, 7, 33, 2, 34, 7, 34, 2, 35, 7, 35, 2, 36, 7, 36, 2, 37, 7, 37, 2, 38, 7, 38, 2, 39, 7, 39, 2, 40, 7, 40, 1, 0, 1, 0, 1, 1, 5, 1, 86, 8, 1, 10, 1, 12, 1, 89, 9, 1, 1, 2, 1, 2, 3, 2, 93, 8, 2, 1, 3, 1, 3, 1, 3, 1, 3, 1, 4, 1, 4, 5, 4, 101, 8, 4, 10, 4, 12, 4, 104, 9, 4, 1, 4, 1, 4, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 3, 5, 113, 8, 5, 1, 6, 1, 6, 1, 6, 3, 6, 118, 8, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 5, 6, 126, 8, 6, 10, 6, 12, 6, 129, 9, 6, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 3, 7, 142, 8, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 5, 7, 152, 8, 7, 10, 7, 12, 7, 155, 9, 7, 1, 8, 1, 8, 1, 8, 1, 8, 1, 9, 1, 9, 1, 10, 1, 10, 3, 10, 165, 8, 10, 1, 11, 1, 11, 1, 11, 1, 11, 5, 11, 171, 8, 11, 10, 11, 12, 11, 174, 9, 11, 1, 11, 3, 11, 177, 8, 11, 3, 11, 179, 8, 11, 1, 11, 1, 11, 1, 12, 1, 12, 5, 12, 185, 8, 12, 10, 12, 12, 12, 188, 9, 12, 1, 12, 1, 12, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 5, 13, 198, 8, 13, 10, 13, 12, 13, 201, 9, 13, 1, 13, 1, 13, 3, 13, 205, 8, 13, 1, 13, 1, 13, 1, 13, 3, 13, 210, 8, 13, 1, 14, 1, 14, 3, 14, 214, 8, 14, 1, 15, 1, 15, 1, 15, 1, 15, 1, 15, 3, 15, 221, 8, 15, 1, 15, 1, 15, 1, 16, 1, 16, 1, 16, 1, 16, 1, 16, 1, 16, 1, 16, 3, 16, 232, 8, 16, 1, 16, 3, 16, 235, 8, 16, 1, 16, 1, 16, 1, 17, 1, 17, 1, 17, 3, 17, 242, 8, 17, 1, 17, 1, 17, 1, 17, 1, 18, 1, 18, 1, 18, 1, 19, 1, 19, 1, 20, 1, 20, 1, 20, 3, 20, 255, 8, 20, 1, 20, 1, 20, 1, 21, 1, 21, 1, 21, 5, 21, 262, 8, 21, 10, 21, 12, 21, 265, 9, 21, 1, 21, 3, 21, 268, 8, 21, 1, 22, 1, 22, 1, 22, 1, 22, 1, 23, 1, 23, 1, 23, 1, 24, 1, 24, 1, 24, 1, 25, 1, 25, 3, 25, 282, 8, 25, 1, 26, 1, 26, 1, 26, 5, 26, 287, 8, 26, 10, 26, 12, 26, 290, 9, 26, 1, 27, 1, 27, 1, 27, 1, 27, 1, 27, 5, 27, 297, 8, 27, 10, 27, 12, 27, 300, 9, 27, 1, 28, 1, 28, 3, 28, 304, 8, 28, 1, 29, 1, 29, 1, 29, 1, 30, 1, 30, 3, 30, 311, 8, 30, 1, 30, 1, 30, 1, 30, 3, 30, 316, 8, 30, 1, 31, 1, 31, 1, 31, 3, 31, 321, 8, 31, 1, 32, 1, 32, 1, 33, 1, 33, 1, 34, 1, 34, 1, 35, 1, 35, 1, 35, 1, 35, 5, 35, 333, 8, 35, 10, 35, 12, 35, 336, 9, 35, 4, 35, 338, 8, 35, 11, 35, 12, 35, 339, 1, 35, 1, 35, 1, 35, 5, 35, 345, 8, 35, 10, 35, 12, 35, 348, 9, 35, 1, 35, 3, 35, 351, 8, 35, 1, 36, 1, 36, 3, 36, 355, 8, 36, 1, 37, 1, 37, 1, 38, 1, 38, 3, 38, 361, 8, 38, 1, 39, 1, 39, 1, 40, 1, 40, 1, 40, 1, 40, 1, 40, 0, 2, 12, 14, 41, 0, 2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30, 32, 34, 36, 38, 40, 42, 44, 46, 48, 50, 52, 54, 56, 58, 60, 62, 64, 66, 68, 70, 72, 74, 76, 78, 80, 0, 7, 2, 0, 13, 14, 16, 16, 2, 0, 7, 7, 22, 22, 2, 0, 39, 39, 41, 41, 2, 0, 25, 25, 33, 33, 4, 0, 20, 21, 27, 28, 34, 34, 37, 37, 5, 0, 18, 18, 25, 25, 32, 32, 36, 36, 40, 40, 2, 0, 19, 19, 26, 26, 376, 0, 82, 1, 0, 0, 0, 2, 87, 1, 0, 0, 0, 4, 92, 1, 0, 0, 0, 6, 94, 1, 0, 0, 0, 8, 98, 1, 0, 0, 0, 10, 112, 1, 0, 0, 0, 12, 117, 1, 0, 0, 0, 14, 141, 1, 0, 0, 0, 16, 156, 1, 0, 0, 0, 18, 160, 1, 0, 0, 0, 20, 164, 1, 0, 0, 0, 22, 166, 1, 0, 0, 0, 24, 182, 1, 0, 0, 0, 26, 204, 1, 0, 0, 0, 28, 213, 1, 0, 0, 0, 30, 215, 1, 0, 0, 0, 32, 224, 1, 0, 0, 0, 34, 238, 1, 0, 0, 0, 36, 246, 1, 0, 0, 0, 38, 249, 1, 0, 0, 0, 40, 251, 1, 0, 0, 0, 42, 258, 1, 0, 0, 0, 44, 269, 1, 0, 0, 0, 46, 273, 1, 0, 0, 0, 48, 276, 1, 0, 0, 0, 50, 281, 1, 0, 0, 0, 52, 283, 1, 0, 0, 0, 54, 291, 1, 0, 0, 0, 56, 303, 1, 0, 0, 0, 58, 305, 1, 0, 0, 0, 60, 310, 1, 0, 0, 0, 62, 320, 1, 0, 0, 0, 64, 322, 1, 0, 0, 0, 66, 324, 1, 0, 0, 0, 68, 326, 1, 0, 0, 0, 70, 350, 1, 0, 0, 0, 72, 354, 1, 0, 0, 0, 74, 356, 1, 0, 0, 0, 76, 360, 1, 0, 0, 0, 78, 362, 1, 0, 0, 0, 80, 364, 1, 0, 0, 0, 82, 83, 3, 2, 1, 0, 83, 1, 1, 0, 0, 0, 84, 86, 3, 4, 2, 0, 85, 84, 1, 0, 0, 0, 86, 89, 1, 0, 0, 0, 87, 85, 1, 0, 0, 0, 87, 88, 1, 0, 0, 0, 88, 3, 1, 0, 0, 0, 89, 87, 1, 0, 0, 0, 90, 93, 3, 6, 3, 0, 91, 93, 3, 8, 4, 0, 92, 90, 1, 0, 0, 0, 92, 91, 1, 0, 0, 0, 93, 5, 1, 0, 0, 0, 94, 95, 5, 8, 0, 0, 95, 96, 5, 7, 0, 0, 96, 97, 3, 12, 6, 0, 97, 7, 1, 0, 0, 0, 98, 102, 5, 8, 0, 0, 99, 101, 3, 10, 5, 0, 100, 99, 1, 0, 0, 0, 101, 104, 1, 0, 0, 0, 102, 100, 1, 0, 0, 0, 102, 103, 1, 0, 0, 0, 103, 105, 1, 0, 0, 0, 104, 102, 1, 0, 0, 0, 105, 106, 3, 16, 8, 0, 106, 9, 1, 0, 0, 0, 107, 108, 5, 15, 0, 0, 108, 109, 3, 78, 39, 0, 109, 110, 5, 15, 0, 0, 110, 113, 1, 0, 0, 0, 111, 113, 5, 8, 0, 0, 112, 107, 1, 0, 0, 0, 112, 111, 1, 0, 0, 0, 113, 11, 1, 0, 0, 0, 114, 115, 6, 6, -1, 0, 115, 118, 3, 14, 7, 0, 116, 118, 3, 56, 28, 0, 117, 114, 1, 0, 0, 0, 117, 116, 1, 0, 0, 0, 118, 127, 1, 0, 0, 0, 119, 120, 10, 1, 0, 0, 120, 121, 5, 29, 0, 0, 121, 122, 3, 12, 6, 0, 122, 123, 5, 22, 0, 0, 123, 124, 3, 12, 6, 2, 124, 126, 1, 0, 0, 0, 125, 119, 1, 0, 0, 0, 126, 129, 1, 0, 0, 0, 127, 125, 1, 0, 0, 0, 127, 128, 1, 0, 0, 0, 128, 13, 1, 0, 0, 0, 129, 127, 1, 0, 0, 0, 130, 131, 6, 7, -1, 0, 131, 142, 3, 70, 35, 0, 132, 142, 3, 18, 9, 0, 133, 142, 3, 28, 14, 0, 134, 142, 3, 20, 10, 0, 135, 142, 3, 38, 19, 0, 136, 142, 3, 40, 20, 0, 137, 138, 5, 24, 0, 0, 138, 139, 3, 12, 6, 0, 139, 140, 5, 31, 0, 0, 140, 142, 1, 0, 0, 0, 141, 130, 1, 0, 0, 0, 141, 132, 1, 0, 0, 0, 141, 133, 1, 0, 0, 0, 141, 134, 1, 0, 0, 0, 141, 135, 1, 0, 0, 0, 141, 136, 1, 0, 0, 0, 141, 137, 1, 0, 0, 0, 142, 153, 1, 0, 0, 0, 143, 144, 10, 5, 0, 0, 144, 152, 3, 44, 22, 0, 145, 146, 10, 4, 0, 0, 146, 152, 3, 46, 23, 0, 147, 148, 10, 3, 0, 0, 148, 152, 3, 48, 24, 0, 149, 150, 10, 2, 0, 0, 150, 152, 3, 50, 25, 0, 151, 143, 1, 0, 0, 0, 151, 145, 1, 0, 0, 0, 151, 147, 1, 0, 0, 0, 151, 149, 1, 0, 0, 0, 152, 155, 1, 0, 0, 0, 153, 151, 1, 0, 0, 0, 153, 154, 1, 0, 0, 0, 154, 15, 1, 0, 0, 0, 155, 153, 1, 0, 0, 0, 156, 157, 5, 5, 0, 0, 157, 158, 3, 2, 1, 0, 158, 159, 5, 6, 0, 0, 159, 17, 1, 0, 0, 0, 160, 161, 7, 0, 0, 0, 161, 19, 1, 0, 0, 0, 162, 165, 3, 22, 11, 0, 163, 165, 3, 24, 12, 0, 164, 162, 1, 0, 0, 0, 164, 163, 1, 0, 0, 0, 165, 21, 1, 0, 0, 0, 166, 178, 5, 23, 0, 0, 167, 172, 3, 12, 6, 0, 168, 169, 5, 39, 0, 0, 169, 171, 3, 12, 6, 0, 170, 168, 1, 0, 0, 0, 171, 174, 1, 0, 0, 0, 172, 170, 1, 0, 0, 0, 172, 173, 1, 0, 0, 0, 173, 176, 1, 0, 0, 0, 174, 172, 1, 0, 0, 0, 175, 177, 5, 39, 0, 0, 176, 175, 1, 0, 0, 0, 176, 177, 1, 0, 0, 0, 177, 179, 1, 0, 0, 0, 178, 167, 1, 0, 0, 0, 178, 179, 1, 0, 0, 0, 179, 180, 1, 0, 0, 0, 180, 181, 5, 30, 0, 0, 181, 23, 1, 0, 0, 0, 182, 186, 5, 5, 0, 0, 183, 185, 3, 26, 13, 0, 184, 183, 1, 0, 0, 0, 185, 188, 1, 0, 0, 0, 186, 184, 1, 0, 0, 0, 186, 187, 1, 0, 0, 0, 187, 189, 1, 0, 0, 0, 188, 186, 1, 0, 0, 0, 189, 190, 5, 6, 0, 0, 190, 25, 1, 0, 0, 0, 191, 205, 5, 8, 0, 0, 192, 193, 5, 24, 0, 0, 193, 194, 5, 8, 0, 0, 194, 205, 5, 31, 0, 0, 195, 199, 5, 15, 0, 0, 196, 198, 3, 76, 38, 0, 197, 196, 1, 0, 0, 0, 198, 201, 1, 0, 0, 0, 199, 197, 1, 0, 0, 0, 199, 200, 1, 0, 0, 0, 200, 202, 1, 0, 0, 0, 201, 199, 1, 0, 0, 0, 202, 205, 5, 15, 0, 0, 203, 205, 3, 12, 6, 0, 204, 191, 1, 0, 0, 0, 204, 192, 1, 0, 0, 0, 204, 195, 1, 0, 0, 0, 204, 203, 1, 0, 0, 0, 205, 206, 1, 0, 0, 0, 206, 207, 7, 1, 0, 0, 207, 209, 3, 12, 6, 0, 208, 210, 5, 39, 0, 0, 209, 208, 1, 0, 0, 0, 209, 210, 1, 0, 0, 0, 210, 27, 1, 0, 0, 0, 211, 214, 3, 30, 15, 0, 212, 214, 3, 32, 16, 0, 213, 211, 1, 0, 0, 0, 213, 212, 1, 0, 0, 0, 214, 29, 1, 0, 0, 0, 215, 216, 5, 2, 0, 0, 216, 217, 3, 34, 17, 0, 217, 218, 5, 22, 0, 0, 218, 220, 3, 12, 6, 0, 219, 221, 3, 36, 18, 0, 220, 219, 1, 0, 0, 0, 220, 221, 1, 0, 0, 0, 221, 222, 1, 0, 0, 0, 222, 223, 5, 30, 0, 0, 223, 31, 1, 0, 0, 0, 224, 225, 5, 1, 0, 0, 225, 226, 3, 34, 17, 0, 226, 227, 5, 22, 0, 0, 227, 228, 3, 12, 6, 0, 228, 229, 5, 38, 0, 0, 229, 231, 3, 12, 6, 0, 230, 232, 5, 41, 0, 0, 231, 230, 1, 0, 0, 0, 231, 232, 1, 0, 0, 0, 232, 234, 1, 0, 0, 0, 233, 235, 3, 36, 18, 0, 234, 233, 1, 0, 0, 0, 234, 235, 1, 0, 0, 0, 235, 236, 1, 0, 0, 0, 236, 237, 5, 6, 0, 0, 237, 33, 1, 0, 0, 0, 238, 241, 5, 8, 0, 0, 239, 240, 5, 39, 0, 0, 240, 242, 5, 8, 0, 0, 241, 239, 1, 0, 0, 0, 241, 242, 1, 0, 0, 0, 242, 243, 1, 0, 0, 0, 243, 244, 5, 4, 0, 0, 244, 245, 3, 12, 6, 0, 245, 35, 1, 0, 0, 0, 246, 247, 5, 3, 0, 0, 247, 248, 3, 12, 6, 0, 248, 37, 1, 0, 0, 0, 249, 250, 5, 8, 0, 0, 250, 39, 1, 0, 0, 0, 251, 252, 5, 8, 0, 0, 252, 254, 5, 24, 0, 0, 253, 255, 3, 42, 21, 0, 254, 253, 1, 0, 0, 0, 254, 255, 1, 0, 0, 0, 255, 256, 1, 0, 0, 0, 256, 257, 5, 31, 0, 0, 257, 41, 1, 0, 0, 0, 258, 263, 3, 12, 6, 0, 259, 260, 5, 39, 0, 0, 260, 262, 3, 12, 6, 0, 261, 259, 1, 0, 0, 0, 262, 265, 1, 0, 0, 0, 263, 261, 1, 0, 0, 0, 263, 264, 1, 0, 0, 0, 264, 267, 1, 0, 0, 0, 265, 263, 1, 0, 0, 0, 266, 268, 7, 2, 0, 0, 267, 266, 1, 0, 0, 0, 267, 268, 1, 0, 0, 0, 268, 43, 1, 0, 0, 0, 269, 270, 5, 23, 0, 0, 270, 271, 3, 12, 6, 0, 271, 272, 5, 30, 0, 0, 272, 45, 1, 0, 0, 0, 273, 274, 5, 35, 0, 0, 274, 275, 5, 8, 0, 0, 275, 47, 1, 0, 0, 0, 276, 277, 5, 35, 0, 0, 277, 278, 5, 13, 0, 0, 278, 49, 1, 0, 0, 0, 279, 282, 3, 52, 26, 0, 280, 282, 3, 54, 27, 0, 281, 279, 1, 0, 0, 0, 281, 280, 1, 0, 0, 0, 282, 51, 1, 0, 0, 0, 283, 284, 5, 35, 0, 0, 284, 288, 5, 32, 0, 0, 285, 287, 3, 46, 23, 0, 286, 285, 1, 0, 0, 0, 287, 290, 1, 0, 0, 0, 288, 286, 1, 0, 0, 0, 288, 289, 1, 0, 0, 0, 289, 53, 1, 0, 0, 0, 290, 288, 1, 0, 0, 0, 291, 292, 5, 23, 0, 0, 292, 293, 5, 32, 0, 0, 293, 298, 5, 30, 0, 0, 294, 297, 3, 46, 23, 0, 295, 297, 3, 44, 22, 0, 296, 294, 1, 0, 0, 0, 296, 295, 1, 0, 0, 0, 297, 300, 1, 0, 0, 0, 298, 296, 1, 0, 0, 0, 298, 299, 1, 0, 0, 0, 299, 55, 1, 0, 0, 0, 300, 298, 1, 0, 0, 0, 301, 304, 3, 58, 29, 0, 302, 304, 3, 60, 30, 0, 303, 301, 1, 0, 0, 0, 303, 302, 1, 0, 0, 0, 304, 57, 1, 0, 0, 0, 305, 306, 7, 3, 0, 0, 306, 307, 3, 14, 7, 0, 307, 59, 1, 0, 0, 0, 308, 311, 3, 14, 7, 0, 309, 311, 3, 58, 29, 0, 310, 308, 1, 0, 0, 0, 310, 309, 1, 0, 0, 0, 311, 312, 1, 0, 0, 0, 312, 315, 3, 62, 31, 0, 313, 316, 3, 14, 7, 0, 314, 316, 3, 56, 28, 0, 315, 313, 1, 0, 0, 0, 315, 314, 1, 0, 0, 0, 316, 61, 1, 0, 0, 0, 317, 321, 3, 64, 32, 0, 318, 321, 3, 66, 33, 0, 319, 321, 3, 68, 34, 0, 320, 317, 1, 0, 0, 0, 320, 318, 1, 0, 0, 0, 320, 319, 1, 0, 0, 0, 321, 63, 1, 0, 0, 0, 322, 323, 7, 4, 0, 0, 323, 65, 1, 0, 0, 0, 324, 325, 7, 5, 0, 0, 325, 67, 1, 0, 0, 0, 326, 327, 7, 6, 0, 0, 327, 69, 1, 0, 0, 0, 328, 329, 5, 17, 0, 0, 329, 337, 5, 8, 0, 0, 330, 334, 5, 12, 0, 0, 331, 333, 3, 72, 36, 0, 332, 331, 1, 0, 0, 0, 333, 336, 1, 0, 0, 0, 334, 332, 1, 0, 0, 0, 334, 335, 1, 0, 0, 0, 335, 338, 1, 0, 0, 0, 336, 334, 1, 0, 0, 0, 337, 330, 1, 0, 0, 0, 338, 339, 1, 0, 0, 0, 339, 337, 1, 0, 0, 0, 339, 340, 1, 0, 0, 0, 340, 341, 1, 0, 0, 0, 341, 351, 5, 8, 0, 0, 342, 346, 5, 15, 0, 0, 343, 345, 3, 76, 38, 0, 344, 343, 1, 0, 0, 0, 345, 348, 1, 0, 0, 0, 346, 344, 1, 0, 0, 0, 346, 347, 1, 0, 0, 0, 347, 349, 1, 0, 0, 0, 348, 346, 1, 0, 0, 0, 349, 351, 5, 15, 0, 0, 350, 328, 1, 0, 0, 0, 350, 342, 1, 0, 0, 0, 351, 71, 1, 0, 0, 0, 352, 355, 3, 80, 40, 0, 353, 355, 3, 74, 37, 0, 354, 352, 1, 0, 0, 0, 354, 353, 1, 0, 0, 0, 355, 73, 1, 0, 0, 0, 356, 357, 5, 46, 0, 0, 357, 75, 1, 0, 0, 0, 358, 361, 3, 80, 40, 0, 359, 361, 3, 78, 39, 0, 360, 358, 1, 0, 0, 0, 360, 359, 1, 0, 0, 0, 361, 77, 1, 0, 0, 0, 362, 363, 5, 44, 0, 0, 363, 79, 1, 0, 0, 0, 364, 365, 5, 43, 0, 0, 365, 366, 3, 12, 6, 0, 366, 367, 5, 6, 0, 0, 367, 81, 1, 0, 0, 0, 39, 87, 92, 102, 112, 117, 127, 141, 151, 153, 164, 172, 176, 178, 186, 199, 204, 209, 213, 220, 231, 234, 241, 254, 263, 267, 281, 288, 296, 298, 303, 310, 315, 320, 334, 339, 346, 350, 354, 360] \ No newline at end of file diff --git a/rewrite-hcl/src/main/java/org/openrewrite/hcl/internal/grammar/HCLParser.java b/rewrite-hcl/src/main/java/org/openrewrite/hcl/internal/grammar/HCLParser.java index 5d5346463fb..2827484b3c4 100644 --- a/rewrite-hcl/src/main/java/org/openrewrite/hcl/internal/grammar/HCLParser.java +++ b/rewrite-hcl/src/main/java/org/openrewrite/hcl/internal/grammar/HCLParser.java @@ -46,19 +46,20 @@ public class HCLParser extends Parser { RULE_tuple = 11, RULE_object = 12, RULE_objectelem = 13, RULE_forExpr = 14, RULE_forTupleExpr = 15, RULE_forObjectExpr = 16, RULE_forIntro = 17, RULE_forCond = 18, RULE_variableExpr = 19, RULE_functionCall = 20, RULE_arguments = 21, RULE_index = 22, - RULE_getAttr = 23, RULE_splat = 24, RULE_attrSplat = 25, RULE_fullSplat = 26, - RULE_operation = 27, RULE_unaryOp = 28, RULE_binaryOp = 29, RULE_binaryOperator = 30, - RULE_compareOperator = 31, RULE_arithmeticOperator = 32, RULE_logicOperator = 33, - RULE_templateExpr = 34, RULE_heredocTemplatePart = 35, RULE_heredocLiteral = 36, - RULE_quotedTemplatePart = 37, RULE_stringLiteral = 38, RULE_templateInterpolation = 39; + RULE_getAttr = 23, RULE_legacyIndexAttr = 24, RULE_splat = 25, RULE_attrSplat = 26, + RULE_fullSplat = 27, RULE_operation = 28, RULE_unaryOp = 29, RULE_binaryOp = 30, + RULE_binaryOperator = 31, RULE_compareOperator = 32, RULE_arithmeticOperator = 33, + RULE_logicOperator = 34, RULE_templateExpr = 35, RULE_heredocTemplatePart = 36, + RULE_heredocLiteral = 37, RULE_quotedTemplatePart = 38, RULE_stringLiteral = 39, + RULE_templateInterpolation = 40; private static String[] makeRuleNames() { return new String[] { "configFile", "body", "bodyContent", "attribute", "block", "blockLabel", "expression", "exprTerm", "blockExpr", "literalValue", "collectionValue", "tuple", "object", "objectelem", "forExpr", "forTupleExpr", "forObjectExpr", "forIntro", "forCond", "variableExpr", "functionCall", "arguments", "index", - "getAttr", "splat", "attrSplat", "fullSplat", "operation", "unaryOp", - "binaryOp", "binaryOperator", "compareOperator", "arithmeticOperator", + "getAttr", "legacyIndexAttr", "splat", "attrSplat", "fullSplat", "operation", + "unaryOp", "binaryOp", "binaryOperator", "compareOperator", "arithmeticOperator", "logicOperator", "templateExpr", "heredocTemplatePart", "heredocLiteral", "quotedTemplatePart", "stringLiteral", "templateInterpolation" }; @@ -168,7 +169,7 @@ public final ConfigFileContext configFile() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(80); + setState(82); body(); } } @@ -217,17 +218,17 @@ public final BodyContext body() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(85); + setState(87); _errHandler.sync(this); _la = _input.LA(1); while (_la==Identifier) { { { - setState(82); + setState(84); bodyContent(); } } - setState(87); + setState(89); _errHandler.sync(this); _la = _input.LA(1); } @@ -275,20 +276,20 @@ public final BodyContentContext bodyContent() throws RecognitionException { BodyContentContext _localctx = new BodyContentContext(_ctx, getState()); enterRule(_localctx, 4, RULE_bodyContent); try { - setState(90); + setState(92); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,1,_ctx) ) { case 1: enterOuterAlt(_localctx, 1); { - setState(88); + setState(90); attribute(); } break; case 2: enterOuterAlt(_localctx, 2); { - setState(89); + setState(91); block(); } break; @@ -337,11 +338,11 @@ public final AttributeContext attribute() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(92); + setState(94); match(Identifier); - setState(93); + setState(95); match(ASSIGN); - setState(94); + setState(96); expression(0); } } @@ -394,23 +395,23 @@ public final BlockContext block() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(96); + setState(98); match(Identifier); - setState(100); + setState(102); _errHandler.sync(this); _la = _input.LA(1); while (_la==Identifier || _la==QUOTE) { { { - setState(97); + setState(99); blockLabel(); } } - setState(102); + setState(104); _errHandler.sync(this); _la = _input.LA(1); } - setState(103); + setState(105); blockExpr(); } } @@ -458,24 +459,24 @@ public final BlockLabelContext blockLabel() throws RecognitionException { BlockLabelContext _localctx = new BlockLabelContext(_ctx, getState()); enterRule(_localctx, 10, RULE_blockLabel); try { - setState(110); + setState(112); _errHandler.sync(this); switch (_input.LA(1)) { case QUOTE: enterOuterAlt(_localctx, 1); { - setState(105); + setState(107); match(QUOTE); - setState(106); + setState(108); stringLiteral(); - setState(107); + setState(109); match(QUOTE); } break; case Identifier: enterOuterAlt(_localctx, 2); { - setState(109); + setState(111); match(Identifier); } break; @@ -587,7 +588,7 @@ private ExpressionContext expression(int _p) throws RecognitionException { int _alt; enterOuterAlt(_localctx, 1); { - setState(115); + setState(117); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,4,_ctx) ) { case 1: @@ -596,7 +597,7 @@ private ExpressionContext expression(int _p) throws RecognitionException { _ctx = _localctx; _prevctx = _localctx; - setState(113); + setState(115); exprTerm(0); } break; @@ -605,13 +606,13 @@ private ExpressionContext expression(int _p) throws RecognitionException { _localctx = new OperationExpressionContext(_localctx); _ctx = _localctx; _prevctx = _localctx; - setState(114); + setState(116); operation(); } break; } _ctx.stop = _input.LT(-1); - setState(125); + setState(127); _errHandler.sync(this); _alt = getInterpreter().adaptivePredict(_input,5,_ctx); while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) { @@ -622,20 +623,20 @@ private ExpressionContext expression(int _p) throws RecognitionException { { _localctx = new ConditionalExpressionContext(new ExpressionContext(_parentctx, _parentState)); pushNewRecursionContext(_localctx, _startState, RULE_expression); - setState(117); + setState(119); if (!(precpred(_ctx, 1))) throw new FailedPredicateException(this, "precpred(_ctx, 1)"); - setState(118); + setState(120); match(QUESTION); - setState(119); + setState(121); expression(0); - setState(120); + setState(122); match(COLON); - setState(121); + setState(123); expression(2); } } } - setState(127); + setState(129); _errHandler.sync(this); _alt = getInterpreter().adaptivePredict(_input,5,_ctx); } @@ -816,6 +817,29 @@ public T accept(ParseTreeVisitor visitor) { } } @SuppressWarnings("CheckReturnValue") + public static class LegacyIndexAttributeExpressionContext extends ExprTermContext { + public ExprTermContext exprTerm() { + return getRuleContext(ExprTermContext.class,0); + } + public LegacyIndexAttrContext legacyIndexAttr() { + return getRuleContext(LegacyIndexAttrContext.class,0); + } + public LegacyIndexAttributeExpressionContext(ExprTermContext ctx) { copyFrom(ctx); } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof HCLParserListener ) ((HCLParserListener)listener).enterLegacyIndexAttributeExpression(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof HCLParserListener ) ((HCLParserListener)listener).exitLegacyIndexAttributeExpression(this); + } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof HCLParserVisitor ) return ((HCLParserVisitor)visitor).visitLegacyIndexAttributeExpression(this); + else return visitor.visitChildren(this); + } + } + @SuppressWarnings("CheckReturnValue") public static class ForExpressionContext extends ExprTermContext { public ForExprContext forExpr() { return getRuleContext(ForExprContext.class,0); @@ -891,7 +915,7 @@ private ExprTermContext exprTerm(int _p) throws RecognitionException { int _alt; enterOuterAlt(_localctx, 1); { - setState(139); + setState(141); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,6,_ctx) ) { case 1: @@ -900,7 +924,7 @@ private ExprTermContext exprTerm(int _p) throws RecognitionException { _ctx = _localctx; _prevctx = _localctx; - setState(129); + setState(131); templateExpr(); } break; @@ -909,7 +933,7 @@ private ExprTermContext exprTerm(int _p) throws RecognitionException { _localctx = new LiteralExpressionContext(_localctx); _ctx = _localctx; _prevctx = _localctx; - setState(130); + setState(132); literalValue(); } break; @@ -918,7 +942,7 @@ private ExprTermContext exprTerm(int _p) throws RecognitionException { _localctx = new ForExpressionContext(_localctx); _ctx = _localctx; _prevctx = _localctx; - setState(131); + setState(133); forExpr(); } break; @@ -927,7 +951,7 @@ private ExprTermContext exprTerm(int _p) throws RecognitionException { _localctx = new CollectionValueExpressionContext(_localctx); _ctx = _localctx; _prevctx = _localctx; - setState(132); + setState(134); collectionValue(); } break; @@ -936,7 +960,7 @@ private ExprTermContext exprTerm(int _p) throws RecognitionException { _localctx = new VariableExpressionContext(_localctx); _ctx = _localctx; _prevctx = _localctx; - setState(133); + setState(135); variableExpr(); } break; @@ -945,7 +969,7 @@ private ExprTermContext exprTerm(int _p) throws RecognitionException { _localctx = new FunctionCallExpressionContext(_localctx); _ctx = _localctx; _prevctx = _localctx; - setState(134); + setState(136); functionCall(); } break; @@ -954,17 +978,17 @@ private ExprTermContext exprTerm(int _p) throws RecognitionException { _localctx = new ParentheticalExpressionContext(_localctx); _ctx = _localctx; _prevctx = _localctx; - setState(135); + setState(137); match(LPAREN); - setState(136); + setState(138); expression(0); - setState(137); + setState(139); match(RPAREN); } break; } _ctx.stop = _input.LT(-1); - setState(149); + setState(153); _errHandler.sync(this); _alt = getInterpreter().adaptivePredict(_input,8,_ctx); while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) { @@ -972,16 +996,16 @@ private ExprTermContext exprTerm(int _p) throws RecognitionException { if ( _parseListeners!=null ) triggerExitRuleEvent(); _prevctx = _localctx; { - setState(147); + setState(151); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,7,_ctx) ) { case 1: { _localctx = new IndexAccessExpressionContext(new ExprTermContext(_parentctx, _parentState)); pushNewRecursionContext(_localctx, _startState, RULE_exprTerm); - setState(141); - if (!(precpred(_ctx, 4))) throw new FailedPredicateException(this, "precpred(_ctx, 4)"); - setState(142); + setState(143); + if (!(precpred(_ctx, 5))) throw new FailedPredicateException(this, "precpred(_ctx, 5)"); + setState(144); index(); } break; @@ -989,26 +1013,36 @@ private ExprTermContext exprTerm(int _p) throws RecognitionException { { _localctx = new AttributeAccessExpressionContext(new ExprTermContext(_parentctx, _parentState)); pushNewRecursionContext(_localctx, _startState, RULE_exprTerm); - setState(143); - if (!(precpred(_ctx, 3))) throw new FailedPredicateException(this, "precpred(_ctx, 3)"); - setState(144); + setState(145); + if (!(precpred(_ctx, 4))) throw new FailedPredicateException(this, "precpred(_ctx, 4)"); + setState(146); getAttr(); } break; case 3: + { + _localctx = new LegacyIndexAttributeExpressionContext(new ExprTermContext(_parentctx, _parentState)); + pushNewRecursionContext(_localctx, _startState, RULE_exprTerm); + setState(147); + if (!(precpred(_ctx, 3))) throw new FailedPredicateException(this, "precpred(_ctx, 3)"); + setState(148); + legacyIndexAttr(); + } + break; + case 4: { _localctx = new SplatExpressionContext(new ExprTermContext(_parentctx, _parentState)); pushNewRecursionContext(_localctx, _startState, RULE_exprTerm); - setState(145); + setState(149); if (!(precpred(_ctx, 2))) throw new FailedPredicateException(this, "precpred(_ctx, 2)"); - setState(146); + setState(150); splat(); } break; } } } - setState(151); + setState(155); _errHandler.sync(this); _alt = getInterpreter().adaptivePredict(_input,8,_ctx); } @@ -1057,11 +1091,11 @@ public final BlockExprContext blockExpr() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(152); + setState(156); match(LBRACE); - setState(153); + setState(157); body(); - setState(154); + setState(158); match(RBRACE); } } @@ -1107,7 +1141,7 @@ public final LiteralValueContext literalValue() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(156); + setState(160); _la = _input.LA(1); if ( !(((_la) & ~0x3f) == 0 && ((1L << _la) & 90112L) != 0) ) { _errHandler.recoverInline(this); @@ -1161,20 +1195,20 @@ public final CollectionValueContext collectionValue() throws RecognitionExceptio CollectionValueContext _localctx = new CollectionValueContext(_ctx, getState()); enterRule(_localctx, 20, RULE_collectionValue); try { - setState(160); + setState(164); _errHandler.sync(this); switch (_input.LA(1)) { case LBRACK: enterOuterAlt(_localctx, 1); { - setState(158); + setState(162); tuple(); } break; case LBRACE: enterOuterAlt(_localctx, 2); { - setState(159); + setState(163); object(); } break; @@ -1234,39 +1268,39 @@ public final TupleContext tuple() throws RecognitionException { int _alt; enterOuterAlt(_localctx, 1); { - setState(162); + setState(166); match(LBRACK); - setState(174); + setState(178); _errHandler.sync(this); _la = _input.LA(1); if (((_la) & ~0x3f) == 0 && ((1L << _la) & 8648909094L) != 0) { { - setState(163); + setState(167); expression(0); - setState(168); + setState(172); _errHandler.sync(this); _alt = getInterpreter().adaptivePredict(_input,10,_ctx); while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) { if ( _alt==1 ) { { { - setState(164); + setState(168); match(COMMA); - setState(165); + setState(169); expression(0); } } } - setState(170); + setState(174); _errHandler.sync(this); _alt = getInterpreter().adaptivePredict(_input,10,_ctx); } - setState(172); + setState(176); _errHandler.sync(this); _la = _input.LA(1); if (_la==COMMA) { { - setState(171); + setState(175); match(COMMA); } } @@ -1274,7 +1308,7 @@ public final TupleContext tuple() throws RecognitionException { } } - setState(176); + setState(180); match(RBRACK); } } @@ -1325,23 +1359,23 @@ public final ObjectContext object() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(178); - match(LBRACE); setState(182); + match(LBRACE); + setState(186); _errHandler.sync(this); _la = _input.LA(1); while (((_la) & ~0x3f) == 0 && ((1L << _la) & 8648909094L) != 0) { { { - setState(179); + setState(183); objectelem(); } } - setState(184); + setState(188); _errHandler.sync(this); _la = _input.LA(1); } - setState(185); + setState(189); match(RBRACE); } } @@ -1406,55 +1440,55 @@ public final ObjectelemContext objectelem() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(200); + setState(204); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,15,_ctx) ) { case 1: { - setState(187); + setState(191); match(Identifier); } break; case 2: { - setState(188); + setState(192); match(LPAREN); - setState(189); + setState(193); match(Identifier); - setState(190); + setState(194); match(RPAREN); } break; case 3: { - setState(191); - match(QUOTE); setState(195); + match(QUOTE); + setState(199); _errHandler.sync(this); _la = _input.LA(1); while (_la==TEMPLATE_INTERPOLATION_START || _la==TemplateStringLiteral) { { { - setState(192); + setState(196); quotedTemplatePart(); } } - setState(197); + setState(201); _errHandler.sync(this); _la = _input.LA(1); } - setState(198); + setState(202); match(QUOTE); } break; case 4: { - setState(199); + setState(203); expression(0); } break; } - setState(202); + setState(206); _la = _input.LA(1); if ( !(_la==ASSIGN || _la==COLON) ) { _errHandler.recoverInline(this); @@ -1464,14 +1498,14 @@ public final ObjectelemContext objectelem() throws RecognitionException { _errHandler.reportMatch(this); consume(); } - setState(203); + setState(207); expression(0); - setState(205); + setState(209); _errHandler.sync(this); _la = _input.LA(1); if (_la==COMMA) { { - setState(204); + setState(208); match(COMMA); } } @@ -1520,20 +1554,20 @@ public final ForExprContext forExpr() throws RecognitionException { ForExprContext _localctx = new ForExprContext(_ctx, getState()); enterRule(_localctx, 28, RULE_forExpr); try { - setState(209); + setState(213); _errHandler.sync(this); switch (_input.LA(1)) { case FOR_BRACK: enterOuterAlt(_localctx, 1); { - setState(207); + setState(211); forTupleExpr(); } break; case FOR_BRACE: enterOuterAlt(_localctx, 2); { - setState(208); + setState(212); forObjectExpr(); } break; @@ -1592,25 +1626,25 @@ public final ForTupleExprContext forTupleExpr() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(211); + setState(215); match(FOR_BRACK); - setState(212); + setState(216); forIntro(); - setState(213); + setState(217); match(COLON); - setState(214); + setState(218); expression(0); - setState(216); + setState(220); _errHandler.sync(this); _la = _input.LA(1); if (_la==IF) { { - setState(215); + setState(219); forCond(); } } - setState(218); + setState(222); match(RBRACK); } } @@ -1670,39 +1704,39 @@ public final ForObjectExprContext forObjectExpr() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(220); + setState(224); match(FOR_BRACE); - setState(221); + setState(225); forIntro(); - setState(222); + setState(226); match(COLON); - setState(223); + setState(227); expression(0); - setState(224); + setState(228); match(ARROW); - setState(225); + setState(229); expression(0); - setState(227); + setState(231); _errHandler.sync(this); _la = _input.LA(1); if (_la==ELLIPSIS) { { - setState(226); + setState(230); match(ELLIPSIS); } } - setState(230); + setState(234); _errHandler.sync(this); _la = _input.LA(1); if (_la==IF) { { - setState(229); + setState(233); forCond(); } } - setState(232); + setState(236); match(RBRACE); } } @@ -1754,23 +1788,23 @@ public final ForIntroContext forIntro() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(234); + setState(238); match(Identifier); - setState(237); + setState(241); _errHandler.sync(this); _la = _input.LA(1); if (_la==COMMA) { { - setState(235); + setState(239); match(COMMA); - setState(236); + setState(240); match(Identifier); } } - setState(239); + setState(243); match(IN); - setState(240); + setState(244); expression(0); } } @@ -1816,9 +1850,9 @@ public final ForCondContext forCond() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(242); + setState(246); match(IF); - setState(243); + setState(247); expression(0); } } @@ -1861,7 +1895,7 @@ public final VariableExprContext variableExpr() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(245); + setState(249); match(Identifier); } } @@ -1910,21 +1944,21 @@ public final FunctionCallContext functionCall() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(247); + setState(251); match(Identifier); - setState(248); + setState(252); match(LPAREN); - setState(250); + setState(254); _errHandler.sync(this); _la = _input.LA(1); if (((_la) & ~0x3f) == 0 && ((1L << _la) & 8648909094L) != 0) { { - setState(249); + setState(253); arguments(); } } - setState(252); + setState(256); match(RPAREN); } } @@ -1979,32 +2013,32 @@ public final ArgumentsContext arguments() throws RecognitionException { int _alt; enterOuterAlt(_localctx, 1); { - setState(254); + setState(258); expression(0); - setState(259); + setState(263); _errHandler.sync(this); _alt = getInterpreter().adaptivePredict(_input,23,_ctx); while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) { if ( _alt==1 ) { { { - setState(255); + setState(259); match(COMMA); - setState(256); + setState(260); expression(0); } } } - setState(261); + setState(265); _errHandler.sync(this); _alt = getInterpreter().adaptivePredict(_input,23,_ctx); } - setState(263); + setState(267); _errHandler.sync(this); _la = _input.LA(1); if (_la==COMMA || _la==ELLIPSIS) { { - setState(262); + setState(266); _la = _input.LA(1); if ( !(_la==COMMA || _la==ELLIPSIS) ) { _errHandler.recoverInline(this); @@ -2062,11 +2096,11 @@ public final IndexContext index() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(265); + setState(269); match(LBRACK); - setState(266); + setState(270); expression(0); - setState(267); + setState(271); match(RBRACK); } } @@ -2110,9 +2144,9 @@ public final GetAttrContext getAttr() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(269); + setState(273); match(DOT); - setState(270); + setState(274); match(Identifier); } } @@ -2127,6 +2161,52 @@ public final GetAttrContext getAttr() throws RecognitionException { return _localctx; } + @SuppressWarnings("CheckReturnValue") + public static class LegacyIndexAttrContext extends ParserRuleContext { + public TerminalNode DOT() { return getToken(HCLParser.DOT, 0); } + public TerminalNode NumericLiteral() { return getToken(HCLParser.NumericLiteral, 0); } + public LegacyIndexAttrContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_legacyIndexAttr; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof HCLParserListener ) ((HCLParserListener)listener).enterLegacyIndexAttr(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof HCLParserListener ) ((HCLParserListener)listener).exitLegacyIndexAttr(this); + } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof HCLParserVisitor ) return ((HCLParserVisitor)visitor).visitLegacyIndexAttr(this); + else return visitor.visitChildren(this); + } + } + + public final LegacyIndexAttrContext legacyIndexAttr() throws RecognitionException { + LegacyIndexAttrContext _localctx = new LegacyIndexAttrContext(_ctx, getState()); + enterRule(_localctx, 48, RULE_legacyIndexAttr); + try { + enterOuterAlt(_localctx, 1); + { + setState(276); + match(DOT); + setState(277); + match(NumericLiteral); + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + @SuppressWarnings("CheckReturnValue") public static class SplatContext extends ParserRuleContext { public AttrSplatContext attrSplat() { @@ -2156,22 +2236,22 @@ public T accept(ParseTreeVisitor visitor) { public final SplatContext splat() throws RecognitionException { SplatContext _localctx = new SplatContext(_ctx, getState()); - enterRule(_localctx, 48, RULE_splat); + enterRule(_localctx, 50, RULE_splat); try { - setState(274); + setState(281); _errHandler.sync(this); switch (_input.LA(1)) { case DOT: enterOuterAlt(_localctx, 1); { - setState(272); + setState(279); attrSplat(); } break; case LBRACK: enterOuterAlt(_localctx, 2); { - setState(273); + setState(280); fullSplat(); } break; @@ -2221,28 +2301,28 @@ public T accept(ParseTreeVisitor visitor) { public final AttrSplatContext attrSplat() throws RecognitionException { AttrSplatContext _localctx = new AttrSplatContext(_ctx, getState()); - enterRule(_localctx, 50, RULE_attrSplat); + enterRule(_localctx, 52, RULE_attrSplat); try { int _alt; enterOuterAlt(_localctx, 1); { - setState(276); + setState(283); match(DOT); - setState(277); + setState(284); match(MUL); - setState(281); + setState(288); _errHandler.sync(this); _alt = getInterpreter().adaptivePredict(_input,26,_ctx); while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) { if ( _alt==1 ) { { { - setState(278); + setState(285); getAttr(); } } } - setState(283); + setState(290); _errHandler.sync(this); _alt = getInterpreter().adaptivePredict(_input,26,_ctx); } @@ -2297,35 +2377,35 @@ public T accept(ParseTreeVisitor visitor) { public final FullSplatContext fullSplat() throws RecognitionException { FullSplatContext _localctx = new FullSplatContext(_ctx, getState()); - enterRule(_localctx, 52, RULE_fullSplat); + enterRule(_localctx, 54, RULE_fullSplat); try { int _alt; enterOuterAlt(_localctx, 1); { - setState(284); + setState(291); match(LBRACK); - setState(285); + setState(292); match(MUL); - setState(286); + setState(293); match(RBRACK); - setState(291); + setState(298); _errHandler.sync(this); _alt = getInterpreter().adaptivePredict(_input,28,_ctx); while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) { if ( _alt==1 ) { { - setState(289); + setState(296); _errHandler.sync(this); switch (_input.LA(1)) { case DOT: { - setState(287); + setState(294); getAttr(); } break; case LBRACK: { - setState(288); + setState(295); index(); } break; @@ -2334,7 +2414,7 @@ public final FullSplatContext fullSplat() throws RecognitionException { } } } - setState(293); + setState(300); _errHandler.sync(this); _alt = getInterpreter().adaptivePredict(_input,28,_ctx); } @@ -2380,22 +2460,22 @@ public T accept(ParseTreeVisitor visitor) { public final OperationContext operation() throws RecognitionException { OperationContext _localctx = new OperationContext(_ctx, getState()); - enterRule(_localctx, 54, RULE_operation); + enterRule(_localctx, 56, RULE_operation); try { - setState(296); + setState(303); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,29,_ctx) ) { case 1: enterOuterAlt(_localctx, 1); { - setState(294); + setState(301); unaryOp(); } break; case 2: enterOuterAlt(_localctx, 2); { - setState(295); + setState(302); binaryOp(); } break; @@ -2440,12 +2520,12 @@ public T accept(ParseTreeVisitor visitor) { public final UnaryOpContext unaryOp() throws RecognitionException { UnaryOpContext _localctx = new UnaryOpContext(_ctx, getState()); - enterRule(_localctx, 56, RULE_unaryOp); + enterRule(_localctx, 58, RULE_unaryOp); int _la; try { enterOuterAlt(_localctx, 1); { - setState(298); + setState(305); _la = _input.LA(1); if ( !(_la==MINUS || _la==NOT) ) { _errHandler.recoverInline(this); @@ -2455,7 +2535,7 @@ public final UnaryOpContext unaryOp() throws RecognitionException { _errHandler.reportMatch(this); consume(); } - setState(299); + setState(306); exprTerm(0); } } @@ -2508,11 +2588,11 @@ public T accept(ParseTreeVisitor visitor) { public final BinaryOpContext binaryOp() throws RecognitionException { BinaryOpContext _localctx = new BinaryOpContext(_ctx, getState()); - enterRule(_localctx, 58, RULE_binaryOp); + enterRule(_localctx, 60, RULE_binaryOp); try { enterOuterAlt(_localctx, 1); { - setState(303); + setState(310); _errHandler.sync(this); switch (_input.LA(1)) { case FOR_BRACE: @@ -2527,34 +2607,34 @@ public final BinaryOpContext binaryOp() throws RecognitionException { case LBRACK: case LPAREN: { - setState(301); + setState(308); exprTerm(0); } break; case MINUS: case NOT: { - setState(302); + setState(309); unaryOp(); } break; default: throw new NoViableAltException(this); } - setState(305); + setState(312); binaryOperator(); - setState(308); + setState(315); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,31,_ctx) ) { case 1: { - setState(306); + setState(313); exprTerm(0); } break; case 2: { - setState(307); + setState(314); operation(); } break; @@ -2604,9 +2684,9 @@ public T accept(ParseTreeVisitor visitor) { public final BinaryOperatorContext binaryOperator() throws RecognitionException { BinaryOperatorContext _localctx = new BinaryOperatorContext(_ctx, getState()); - enterRule(_localctx, 60, RULE_binaryOperator); + enterRule(_localctx, 62, RULE_binaryOperator); try { - setState(313); + setState(320); _errHandler.sync(this); switch (_input.LA(1)) { case EQ: @@ -2617,7 +2697,7 @@ public final BinaryOperatorContext binaryOperator() throws RecognitionException case GEQ: enterOuterAlt(_localctx, 1); { - setState(310); + setState(317); compareOperator(); } break; @@ -2628,7 +2708,7 @@ public final BinaryOperatorContext binaryOperator() throws RecognitionException case MOD: enterOuterAlt(_localctx, 2); { - setState(311); + setState(318); arithmeticOperator(); } break; @@ -2636,7 +2716,7 @@ public final BinaryOperatorContext binaryOperator() throws RecognitionException case OR: enterOuterAlt(_localctx, 3); { - setState(312); + setState(319); logicOperator(); } break; @@ -2684,12 +2764,12 @@ public T accept(ParseTreeVisitor visitor) { public final CompareOperatorContext compareOperator() throws RecognitionException { CompareOperatorContext _localctx = new CompareOperatorContext(_ctx, getState()); - enterRule(_localctx, 62, RULE_compareOperator); + enterRule(_localctx, 64, RULE_compareOperator); int _la; try { enterOuterAlt(_localctx, 1); { - setState(315); + setState(322); _la = _input.LA(1); if ( !(((_la) & ~0x3f) == 0 && ((1L << _la) & 155024621568L) != 0) ) { _errHandler.recoverInline(this); @@ -2740,12 +2820,12 @@ public T accept(ParseTreeVisitor visitor) { public final ArithmeticOperatorContext arithmeticOperator() throws RecognitionException { ArithmeticOperatorContext _localctx = new ArithmeticOperatorContext(_ctx, getState()); - enterRule(_localctx, 64, RULE_arithmeticOperator); + enterRule(_localctx, 66, RULE_arithmeticOperator); int _la; try { enterOuterAlt(_localctx, 1); { - setState(317); + setState(324); _la = _input.LA(1); if ( !(((_la) & ~0x3f) == 0 && ((1L << _la) & 1172559888384L) != 0) ) { _errHandler.recoverInline(this); @@ -2793,12 +2873,12 @@ public T accept(ParseTreeVisitor visitor) { public final LogicOperatorContext logicOperator() throws RecognitionException { LogicOperatorContext _localctx = new LogicOperatorContext(_ctx, getState()); - enterRule(_localctx, 66, RULE_logicOperator); + enterRule(_localctx, 68, RULE_logicOperator); int _la; try { enterOuterAlt(_localctx, 1); { - setState(319); + setState(326); _la = _input.LA(1); if ( !(_la==AND || _la==OR) ) { _errHandler.recoverInline(this); @@ -2895,49 +2975,49 @@ public T accept(ParseTreeVisitor visitor) { public final TemplateExprContext templateExpr() throws RecognitionException { TemplateExprContext _localctx = new TemplateExprContext(_ctx, getState()); - enterRule(_localctx, 68, RULE_templateExpr); + enterRule(_localctx, 70, RULE_templateExpr); int _la; try { - setState(343); + setState(350); _errHandler.sync(this); switch (_input.LA(1)) { case HEREDOC_START: _localctx = new HeredocContext(_localctx); enterOuterAlt(_localctx, 1); { - setState(321); + setState(328); match(HEREDOC_START); - setState(322); + setState(329); match(Identifier); - setState(330); + setState(337); _errHandler.sync(this); _la = _input.LA(1); do { { { - setState(323); + setState(330); match(NEWLINE); - setState(327); + setState(334); _errHandler.sync(this); _la = _input.LA(1); while (_la==TEMPLATE_INTERPOLATION_START || _la==HTemplateLiteral) { { { - setState(324); + setState(331); heredocTemplatePart(); } } - setState(329); + setState(336); _errHandler.sync(this); _la = _input.LA(1); } } } - setState(332); + setState(339); _errHandler.sync(this); _la = _input.LA(1); } while ( _la==NEWLINE ); - setState(334); + setState(341); match(Identifier); } break; @@ -2945,23 +3025,23 @@ public final TemplateExprContext templateExpr() throws RecognitionException { _localctx = new QuotedTemplateContext(_localctx); enterOuterAlt(_localctx, 2); { - setState(335); + setState(342); match(QUOTE); - setState(339); + setState(346); _errHandler.sync(this); _la = _input.LA(1); while (_la==TEMPLATE_INTERPOLATION_START || _la==TemplateStringLiteral) { { { - setState(336); + setState(343); quotedTemplatePart(); } } - setState(341); + setState(348); _errHandler.sync(this); _la = _input.LA(1); } - setState(342); + setState(349); match(QUOTE); } break; @@ -3009,22 +3089,22 @@ public T accept(ParseTreeVisitor visitor) { public final HeredocTemplatePartContext heredocTemplatePart() throws RecognitionException { HeredocTemplatePartContext _localctx = new HeredocTemplatePartContext(_ctx, getState()); - enterRule(_localctx, 70, RULE_heredocTemplatePart); + enterRule(_localctx, 72, RULE_heredocTemplatePart); try { - setState(347); + setState(354); _errHandler.sync(this); switch (_input.LA(1)) { case TEMPLATE_INTERPOLATION_START: enterOuterAlt(_localctx, 1); { - setState(345); + setState(352); templateInterpolation(); } break; case HTemplateLiteral: enterOuterAlt(_localctx, 2); { - setState(346); + setState(353); heredocLiteral(); } break; @@ -3067,11 +3147,11 @@ public T accept(ParseTreeVisitor visitor) { public final HeredocLiteralContext heredocLiteral() throws RecognitionException { HeredocLiteralContext _localctx = new HeredocLiteralContext(_ctx, getState()); - enterRule(_localctx, 72, RULE_heredocLiteral); + enterRule(_localctx, 74, RULE_heredocLiteral); try { enterOuterAlt(_localctx, 1); { - setState(349); + setState(356); match(HTemplateLiteral); } } @@ -3115,22 +3195,22 @@ public T accept(ParseTreeVisitor visitor) { public final QuotedTemplatePartContext quotedTemplatePart() throws RecognitionException { QuotedTemplatePartContext _localctx = new QuotedTemplatePartContext(_ctx, getState()); - enterRule(_localctx, 74, RULE_quotedTemplatePart); + enterRule(_localctx, 76, RULE_quotedTemplatePart); try { - setState(353); + setState(360); _errHandler.sync(this); switch (_input.LA(1)) { case TEMPLATE_INTERPOLATION_START: enterOuterAlt(_localctx, 1); { - setState(351); + setState(358); templateInterpolation(); } break; case TemplateStringLiteral: enterOuterAlt(_localctx, 2); { - setState(352); + setState(359); stringLiteral(); } break; @@ -3173,11 +3253,11 @@ public T accept(ParseTreeVisitor visitor) { public final StringLiteralContext stringLiteral() throws RecognitionException { StringLiteralContext _localctx = new StringLiteralContext(_ctx, getState()); - enterRule(_localctx, 76, RULE_stringLiteral); + enterRule(_localctx, 78, RULE_stringLiteral); try { enterOuterAlt(_localctx, 1); { - setState(355); + setState(362); match(TemplateStringLiteral); } } @@ -3220,15 +3300,15 @@ public T accept(ParseTreeVisitor visitor) { public final TemplateInterpolationContext templateInterpolation() throws RecognitionException { TemplateInterpolationContext _localctx = new TemplateInterpolationContext(_ctx, getState()); - enterRule(_localctx, 78, RULE_templateInterpolation); + enterRule(_localctx, 80, RULE_templateInterpolation); try { enterOuterAlt(_localctx, 1); { - setState(357); + setState(364); match(TEMPLATE_INTERPOLATION_START); - setState(358); + setState(365); expression(0); - setState(359); + setState(366); match(RBRACE); } } @@ -3263,17 +3343,19 @@ private boolean expression_sempred(ExpressionContext _localctx, int predIndex) { private boolean exprTerm_sempred(ExprTermContext _localctx, int predIndex) { switch (predIndex) { case 1: - return precpred(_ctx, 4); + return precpred(_ctx, 5); case 2: - return precpred(_ctx, 3); + return precpred(_ctx, 4); case 3: + return precpred(_ctx, 3); + case 4: return precpred(_ctx, 2); } return true; } public static final String _serializedATN = - "\u0004\u0001/\u016a\u0002\u0000\u0007\u0000\u0002\u0001\u0007\u0001\u0002"+ + "\u0004\u0001/\u0171\u0002\u0000\u0007\u0000\u0002\u0001\u0007\u0001\u0002"+ "\u0002\u0007\u0002\u0002\u0003\u0007\u0003\u0002\u0004\u0007\u0004\u0002"+ "\u0005\u0007\u0005\u0002\u0006\u0007\u0006\u0002\u0007\u0007\u0007\u0002"+ "\b\u0007\b\u0002\t\u0007\t\u0002\n\u0007\n\u0002\u000b\u0007\u000b\u0002"+ @@ -3284,225 +3366,229 @@ private boolean exprTerm_sempred(ExprTermContext _localctx, int predIndex) { "\u0002\u0019\u0007\u0019\u0002\u001a\u0007\u001a\u0002\u001b\u0007\u001b"+ "\u0002\u001c\u0007\u001c\u0002\u001d\u0007\u001d\u0002\u001e\u0007\u001e"+ "\u0002\u001f\u0007\u001f\u0002 \u0007 \u0002!\u0007!\u0002\"\u0007\"\u0002"+ - "#\u0007#\u0002$\u0007$\u0002%\u0007%\u0002&\u0007&\u0002\'\u0007\'\u0001"+ - "\u0000\u0001\u0000\u0001\u0001\u0005\u0001T\b\u0001\n\u0001\f\u0001W\t"+ - "\u0001\u0001\u0002\u0001\u0002\u0003\u0002[\b\u0002\u0001\u0003\u0001"+ - "\u0003\u0001\u0003\u0001\u0003\u0001\u0004\u0001\u0004\u0005\u0004c\b"+ - "\u0004\n\u0004\f\u0004f\t\u0004\u0001\u0004\u0001\u0004\u0001\u0005\u0001"+ - "\u0005\u0001\u0005\u0001\u0005\u0001\u0005\u0003\u0005o\b\u0005\u0001"+ - "\u0006\u0001\u0006\u0001\u0006\u0003\u0006t\b\u0006\u0001\u0006\u0001"+ - "\u0006\u0001\u0006\u0001\u0006\u0001\u0006\u0001\u0006\u0005\u0006|\b"+ - "\u0006\n\u0006\f\u0006\u007f\t\u0006\u0001\u0007\u0001\u0007\u0001\u0007"+ - "\u0001\u0007\u0001\u0007\u0001\u0007\u0001\u0007\u0001\u0007\u0001\u0007"+ - "\u0001\u0007\u0001\u0007\u0003\u0007\u008c\b\u0007\u0001\u0007\u0001\u0007"+ - "\u0001\u0007\u0001\u0007\u0001\u0007\u0001\u0007\u0005\u0007\u0094\b\u0007"+ - "\n\u0007\f\u0007\u0097\t\u0007\u0001\b\u0001\b\u0001\b\u0001\b\u0001\t"+ - "\u0001\t\u0001\n\u0001\n\u0003\n\u00a1\b\n\u0001\u000b\u0001\u000b\u0001"+ - "\u000b\u0001\u000b\u0005\u000b\u00a7\b\u000b\n\u000b\f\u000b\u00aa\t\u000b"+ - "\u0001\u000b\u0003\u000b\u00ad\b\u000b\u0003\u000b\u00af\b\u000b\u0001"+ - "\u000b\u0001\u000b\u0001\f\u0001\f\u0005\f\u00b5\b\f\n\f\f\f\u00b8\t\f"+ - "\u0001\f\u0001\f\u0001\r\u0001\r\u0001\r\u0001\r\u0001\r\u0001\r\u0005"+ - "\r\u00c2\b\r\n\r\f\r\u00c5\t\r\u0001\r\u0001\r\u0003\r\u00c9\b\r\u0001"+ - "\r\u0001\r\u0001\r\u0003\r\u00ce\b\r\u0001\u000e\u0001\u000e\u0003\u000e"+ - "\u00d2\b\u000e\u0001\u000f\u0001\u000f\u0001\u000f\u0001\u000f\u0001\u000f"+ - "\u0003\u000f\u00d9\b\u000f\u0001\u000f\u0001\u000f\u0001\u0010\u0001\u0010"+ - "\u0001\u0010\u0001\u0010\u0001\u0010\u0001\u0010\u0001\u0010\u0003\u0010"+ - "\u00e4\b\u0010\u0001\u0010\u0003\u0010\u00e7\b\u0010\u0001\u0010\u0001"+ - "\u0010\u0001\u0011\u0001\u0011\u0001\u0011\u0003\u0011\u00ee\b\u0011\u0001"+ - "\u0011\u0001\u0011\u0001\u0011\u0001\u0012\u0001\u0012\u0001\u0012\u0001"+ - "\u0013\u0001\u0013\u0001\u0014\u0001\u0014\u0001\u0014\u0003\u0014\u00fb"+ - "\b\u0014\u0001\u0014\u0001\u0014\u0001\u0015\u0001\u0015\u0001\u0015\u0005"+ - "\u0015\u0102\b\u0015\n\u0015\f\u0015\u0105\t\u0015\u0001\u0015\u0003\u0015"+ - "\u0108\b\u0015\u0001\u0016\u0001\u0016\u0001\u0016\u0001\u0016\u0001\u0017"+ - "\u0001\u0017\u0001\u0017\u0001\u0018\u0001\u0018\u0003\u0018\u0113\b\u0018"+ - "\u0001\u0019\u0001\u0019\u0001\u0019\u0005\u0019\u0118\b\u0019\n\u0019"+ - "\f\u0019\u011b\t\u0019\u0001\u001a\u0001\u001a\u0001\u001a\u0001\u001a"+ - "\u0001\u001a\u0005\u001a\u0122\b\u001a\n\u001a\f\u001a\u0125\t\u001a\u0001"+ - "\u001b\u0001\u001b\u0003\u001b\u0129\b\u001b\u0001\u001c\u0001\u001c\u0001"+ - "\u001c\u0001\u001d\u0001\u001d\u0003\u001d\u0130\b\u001d\u0001\u001d\u0001"+ - "\u001d\u0001\u001d\u0003\u001d\u0135\b\u001d\u0001\u001e\u0001\u001e\u0001"+ - "\u001e\u0003\u001e\u013a\b\u001e\u0001\u001f\u0001\u001f\u0001 \u0001"+ - " \u0001!\u0001!\u0001\"\u0001\"\u0001\"\u0001\"\u0005\"\u0146\b\"\n\""+ - "\f\"\u0149\t\"\u0004\"\u014b\b\"\u000b\"\f\"\u014c\u0001\"\u0001\"\u0001"+ - "\"\u0005\"\u0152\b\"\n\"\f\"\u0155\t\"\u0001\"\u0003\"\u0158\b\"\u0001"+ - "#\u0001#\u0003#\u015c\b#\u0001$\u0001$\u0001%\u0001%\u0003%\u0162\b%\u0001"+ - "&\u0001&\u0001\'\u0001\'\u0001\'\u0001\'\u0001\'\u0000\u0002\f\u000e("+ - "\u0000\u0002\u0004\u0006\b\n\f\u000e\u0010\u0012\u0014\u0016\u0018\u001a"+ - "\u001c\u001e \"$&(*,.02468:<>@BDFHJLN\u0000\u0007\u0002\u0000\r\u000e"+ - "\u0010\u0010\u0002\u0000\u0007\u0007\u0016\u0016\u0002\u0000\'\'))\u0002"+ - "\u0000\u0019\u0019!!\u0004\u0000\u0014\u0015\u001b\u001c\"\"%%\u0005\u0000"+ - "\u0012\u0012\u0019\u0019 $$((\u0002\u0000\u0013\u0013\u001a\u001a\u0171"+ - "\u0000P\u0001\u0000\u0000\u0000\u0002U\u0001\u0000\u0000\u0000\u0004Z"+ - "\u0001\u0000\u0000\u0000\u0006\\\u0001\u0000\u0000\u0000\b`\u0001\u0000"+ - "\u0000\u0000\nn\u0001\u0000\u0000\u0000\fs\u0001\u0000\u0000\u0000\u000e"+ - "\u008b\u0001\u0000\u0000\u0000\u0010\u0098\u0001\u0000\u0000\u0000\u0012"+ - "\u009c\u0001\u0000\u0000\u0000\u0014\u00a0\u0001\u0000\u0000\u0000\u0016"+ - "\u00a2\u0001\u0000\u0000\u0000\u0018\u00b2\u0001\u0000\u0000\u0000\u001a"+ - "\u00c8\u0001\u0000\u0000\u0000\u001c\u00d1\u0001\u0000\u0000\u0000\u001e"+ - "\u00d3\u0001\u0000\u0000\u0000 \u00dc\u0001\u0000\u0000\u0000\"\u00ea"+ - "\u0001\u0000\u0000\u0000$\u00f2\u0001\u0000\u0000\u0000&\u00f5\u0001\u0000"+ - "\u0000\u0000(\u00f7\u0001\u0000\u0000\u0000*\u00fe\u0001\u0000\u0000\u0000"+ - ",\u0109\u0001\u0000\u0000\u0000.\u010d\u0001\u0000\u0000\u00000\u0112"+ - "\u0001\u0000\u0000\u00002\u0114\u0001\u0000\u0000\u00004\u011c\u0001\u0000"+ - "\u0000\u00006\u0128\u0001\u0000\u0000\u00008\u012a\u0001\u0000\u0000\u0000"+ - ":\u012f\u0001\u0000\u0000\u0000<\u0139\u0001\u0000\u0000\u0000>\u013b"+ - "\u0001\u0000\u0000\u0000@\u013d\u0001\u0000\u0000\u0000B\u013f\u0001\u0000"+ - "\u0000\u0000D\u0157\u0001\u0000\u0000\u0000F\u015b\u0001\u0000\u0000\u0000"+ - "H\u015d\u0001\u0000\u0000\u0000J\u0161\u0001\u0000\u0000\u0000L\u0163"+ - "\u0001\u0000\u0000\u0000N\u0165\u0001\u0000\u0000\u0000PQ\u0003\u0002"+ - "\u0001\u0000Q\u0001\u0001\u0000\u0000\u0000RT\u0003\u0004\u0002\u0000"+ - "SR\u0001\u0000\u0000\u0000TW\u0001\u0000\u0000\u0000US\u0001\u0000\u0000"+ - "\u0000UV\u0001\u0000\u0000\u0000V\u0003\u0001\u0000\u0000\u0000WU\u0001"+ - "\u0000\u0000\u0000X[\u0003\u0006\u0003\u0000Y[\u0003\b\u0004\u0000ZX\u0001"+ - "\u0000\u0000\u0000ZY\u0001\u0000\u0000\u0000[\u0005\u0001\u0000\u0000"+ - "\u0000\\]\u0005\b\u0000\u0000]^\u0005\u0007\u0000\u0000^_\u0003\f\u0006"+ - "\u0000_\u0007\u0001\u0000\u0000\u0000`d\u0005\b\u0000\u0000ac\u0003\n"+ - "\u0005\u0000ba\u0001\u0000\u0000\u0000cf\u0001\u0000\u0000\u0000db\u0001"+ - "\u0000\u0000\u0000de\u0001\u0000\u0000\u0000eg\u0001\u0000\u0000\u0000"+ - "fd\u0001\u0000\u0000\u0000gh\u0003\u0010\b\u0000h\t\u0001\u0000\u0000"+ - "\u0000ij\u0005\u000f\u0000\u0000jk\u0003L&\u0000kl\u0005\u000f\u0000\u0000"+ - "lo\u0001\u0000\u0000\u0000mo\u0005\b\u0000\u0000ni\u0001\u0000\u0000\u0000"+ - "nm\u0001\u0000\u0000\u0000o\u000b\u0001\u0000\u0000\u0000pq\u0006\u0006"+ - "\uffff\uffff\u0000qt\u0003\u000e\u0007\u0000rt\u00036\u001b\u0000sp\u0001"+ - "\u0000\u0000\u0000sr\u0001\u0000\u0000\u0000t}\u0001\u0000\u0000\u0000"+ - "uv\n\u0001\u0000\u0000vw\u0005\u001d\u0000\u0000wx\u0003\f\u0006\u0000"+ - "xy\u0005\u0016\u0000\u0000yz\u0003\f\u0006\u0002z|\u0001\u0000\u0000\u0000"+ - "{u\u0001\u0000\u0000\u0000|\u007f\u0001\u0000\u0000\u0000}{\u0001\u0000"+ - "\u0000\u0000}~\u0001\u0000\u0000\u0000~\r\u0001\u0000\u0000\u0000\u007f"+ - "}\u0001\u0000\u0000\u0000\u0080\u0081\u0006\u0007\uffff\uffff\u0000\u0081"+ - "\u008c\u0003D\"\u0000\u0082\u008c\u0003\u0012\t\u0000\u0083\u008c\u0003"+ - "\u001c\u000e\u0000\u0084\u008c\u0003\u0014\n\u0000\u0085\u008c\u0003&"+ - "\u0013\u0000\u0086\u008c\u0003(\u0014\u0000\u0087\u0088\u0005\u0018\u0000"+ - "\u0000\u0088\u0089\u0003\f\u0006\u0000\u0089\u008a\u0005\u001f\u0000\u0000"+ - "\u008a\u008c\u0001\u0000\u0000\u0000\u008b\u0080\u0001\u0000\u0000\u0000"+ - "\u008b\u0082\u0001\u0000\u0000\u0000\u008b\u0083\u0001\u0000\u0000\u0000"+ - "\u008b\u0084\u0001\u0000\u0000\u0000\u008b\u0085\u0001\u0000\u0000\u0000"+ - "\u008b\u0086\u0001\u0000\u0000\u0000\u008b\u0087\u0001\u0000\u0000\u0000"+ - "\u008c\u0095\u0001\u0000\u0000\u0000\u008d\u008e\n\u0004\u0000\u0000\u008e"+ - "\u0094\u0003,\u0016\u0000\u008f\u0090\n\u0003\u0000\u0000\u0090\u0094"+ - "\u0003.\u0017\u0000\u0091\u0092\n\u0002\u0000\u0000\u0092\u0094\u0003"+ - "0\u0018\u0000\u0093\u008d\u0001\u0000\u0000\u0000\u0093\u008f\u0001\u0000"+ - "\u0000\u0000\u0093\u0091\u0001\u0000\u0000\u0000\u0094\u0097\u0001\u0000"+ - "\u0000\u0000\u0095\u0093\u0001\u0000\u0000\u0000\u0095\u0096\u0001\u0000"+ - "\u0000\u0000\u0096\u000f\u0001\u0000\u0000\u0000\u0097\u0095\u0001\u0000"+ - "\u0000\u0000\u0098\u0099\u0005\u0005\u0000\u0000\u0099\u009a\u0003\u0002"+ - "\u0001\u0000\u009a\u009b\u0005\u0006\u0000\u0000\u009b\u0011\u0001\u0000"+ - "\u0000\u0000\u009c\u009d\u0007\u0000\u0000\u0000\u009d\u0013\u0001\u0000"+ - "\u0000\u0000\u009e\u00a1\u0003\u0016\u000b\u0000\u009f\u00a1\u0003\u0018"+ - "\f\u0000\u00a0\u009e\u0001\u0000\u0000\u0000\u00a0\u009f\u0001\u0000\u0000"+ - "\u0000\u00a1\u0015\u0001\u0000\u0000\u0000\u00a2\u00ae\u0005\u0017\u0000"+ - "\u0000\u00a3\u00a8\u0003\f\u0006\u0000\u00a4\u00a5\u0005\'\u0000\u0000"+ - "\u00a5\u00a7\u0003\f\u0006\u0000\u00a6\u00a4\u0001\u0000\u0000\u0000\u00a7"+ - "\u00aa\u0001\u0000\u0000\u0000\u00a8\u00a6\u0001\u0000\u0000\u0000\u00a8"+ - "\u00a9\u0001\u0000\u0000\u0000\u00a9\u00ac\u0001\u0000\u0000\u0000\u00aa"+ - "\u00a8\u0001\u0000\u0000\u0000\u00ab\u00ad\u0005\'\u0000\u0000\u00ac\u00ab"+ - "\u0001\u0000\u0000\u0000\u00ac\u00ad\u0001\u0000\u0000\u0000\u00ad\u00af"+ - "\u0001\u0000\u0000\u0000\u00ae\u00a3\u0001\u0000\u0000\u0000\u00ae\u00af"+ - "\u0001\u0000\u0000\u0000\u00af\u00b0\u0001\u0000\u0000\u0000\u00b0\u00b1"+ - "\u0005\u001e\u0000\u0000\u00b1\u0017\u0001\u0000\u0000\u0000\u00b2\u00b6"+ - "\u0005\u0005\u0000\u0000\u00b3\u00b5\u0003\u001a\r\u0000\u00b4\u00b3\u0001"+ - "\u0000\u0000\u0000\u00b5\u00b8\u0001\u0000\u0000\u0000\u00b6\u00b4\u0001"+ - "\u0000\u0000\u0000\u00b6\u00b7\u0001\u0000\u0000\u0000\u00b7\u00b9\u0001"+ - "\u0000\u0000\u0000\u00b8\u00b6\u0001\u0000\u0000\u0000\u00b9\u00ba\u0005"+ - "\u0006\u0000\u0000\u00ba\u0019\u0001\u0000\u0000\u0000\u00bb\u00c9\u0005"+ - "\b\u0000\u0000\u00bc\u00bd\u0005\u0018\u0000\u0000\u00bd\u00be\u0005\b"+ - "\u0000\u0000\u00be\u00c9\u0005\u001f\u0000\u0000\u00bf\u00c3\u0005\u000f"+ - "\u0000\u0000\u00c0\u00c2\u0003J%\u0000\u00c1\u00c0\u0001\u0000\u0000\u0000"+ - "\u00c2\u00c5\u0001\u0000\u0000\u0000\u00c3\u00c1\u0001\u0000\u0000\u0000"+ - "\u00c3\u00c4\u0001\u0000\u0000\u0000\u00c4\u00c6\u0001\u0000\u0000\u0000"+ - "\u00c5\u00c3\u0001\u0000\u0000\u0000\u00c6\u00c9\u0005\u000f\u0000\u0000"+ - "\u00c7\u00c9\u0003\f\u0006\u0000\u00c8\u00bb\u0001\u0000\u0000\u0000\u00c8"+ - "\u00bc\u0001\u0000\u0000\u0000\u00c8\u00bf\u0001\u0000\u0000\u0000\u00c8"+ - "\u00c7\u0001\u0000\u0000\u0000\u00c9\u00ca\u0001\u0000\u0000\u0000\u00ca"+ - "\u00cb\u0007\u0001\u0000\u0000\u00cb\u00cd\u0003\f\u0006\u0000\u00cc\u00ce"+ - "\u0005\'\u0000\u0000\u00cd\u00cc\u0001\u0000\u0000\u0000\u00cd\u00ce\u0001"+ - "\u0000\u0000\u0000\u00ce\u001b\u0001\u0000\u0000\u0000\u00cf\u00d2\u0003"+ - "\u001e\u000f\u0000\u00d0\u00d2\u0003 \u0010\u0000\u00d1\u00cf\u0001\u0000"+ - "\u0000\u0000\u00d1\u00d0\u0001\u0000\u0000\u0000\u00d2\u001d\u0001\u0000"+ - "\u0000\u0000\u00d3\u00d4\u0005\u0002\u0000\u0000\u00d4\u00d5\u0003\"\u0011"+ - "\u0000\u00d5\u00d6\u0005\u0016\u0000\u0000\u00d6\u00d8\u0003\f\u0006\u0000"+ - "\u00d7\u00d9\u0003$\u0012\u0000\u00d8\u00d7\u0001\u0000\u0000\u0000\u00d8"+ - "\u00d9\u0001\u0000\u0000\u0000\u00d9\u00da\u0001\u0000\u0000\u0000\u00da"+ - "\u00db\u0005\u001e\u0000\u0000\u00db\u001f\u0001\u0000\u0000\u0000\u00dc"+ - "\u00dd\u0005\u0001\u0000\u0000\u00dd\u00de\u0003\"\u0011\u0000\u00de\u00df"+ - "\u0005\u0016\u0000\u0000\u00df\u00e0\u0003\f\u0006\u0000\u00e0\u00e1\u0005"+ - "&\u0000\u0000\u00e1\u00e3\u0003\f\u0006\u0000\u00e2\u00e4\u0005)\u0000"+ - "\u0000\u00e3\u00e2\u0001\u0000\u0000\u0000\u00e3\u00e4\u0001\u0000\u0000"+ - "\u0000\u00e4\u00e6\u0001\u0000\u0000\u0000\u00e5\u00e7\u0003$\u0012\u0000"+ - "\u00e6\u00e5\u0001\u0000\u0000\u0000\u00e6\u00e7\u0001\u0000\u0000\u0000"+ - "\u00e7\u00e8\u0001\u0000\u0000\u0000\u00e8\u00e9\u0005\u0006\u0000\u0000"+ - "\u00e9!\u0001\u0000\u0000\u0000\u00ea\u00ed\u0005\b\u0000\u0000\u00eb"+ - "\u00ec\u0005\'\u0000\u0000\u00ec\u00ee\u0005\b\u0000\u0000\u00ed\u00eb"+ - "\u0001\u0000\u0000\u0000\u00ed\u00ee\u0001\u0000\u0000\u0000\u00ee\u00ef"+ - "\u0001\u0000\u0000\u0000\u00ef\u00f0\u0005\u0004\u0000\u0000\u00f0\u00f1"+ - "\u0003\f\u0006\u0000\u00f1#\u0001\u0000\u0000\u0000\u00f2\u00f3\u0005"+ - "\u0003\u0000\u0000\u00f3\u00f4\u0003\f\u0006\u0000\u00f4%\u0001\u0000"+ - "\u0000\u0000\u00f5\u00f6\u0005\b\u0000\u0000\u00f6\'\u0001\u0000\u0000"+ - "\u0000\u00f7\u00f8\u0005\b\u0000\u0000\u00f8\u00fa\u0005\u0018\u0000\u0000"+ - "\u00f9\u00fb\u0003*\u0015\u0000\u00fa\u00f9\u0001\u0000\u0000\u0000\u00fa"+ - "\u00fb\u0001\u0000\u0000\u0000\u00fb\u00fc\u0001\u0000\u0000\u0000\u00fc"+ - "\u00fd\u0005\u001f\u0000\u0000\u00fd)\u0001\u0000\u0000\u0000\u00fe\u0103"+ - "\u0003\f\u0006\u0000\u00ff\u0100\u0005\'\u0000\u0000\u0100\u0102\u0003"+ - "\f\u0006\u0000\u0101\u00ff\u0001\u0000\u0000\u0000\u0102\u0105\u0001\u0000"+ - "\u0000\u0000\u0103\u0101\u0001\u0000\u0000\u0000\u0103\u0104\u0001\u0000"+ - "\u0000\u0000\u0104\u0107\u0001\u0000\u0000\u0000\u0105\u0103\u0001\u0000"+ - "\u0000\u0000\u0106\u0108\u0007\u0002\u0000\u0000\u0107\u0106\u0001\u0000"+ - "\u0000\u0000\u0107\u0108\u0001\u0000\u0000\u0000\u0108+\u0001\u0000\u0000"+ - "\u0000\u0109\u010a\u0005\u0017\u0000\u0000\u010a\u010b\u0003\f\u0006\u0000"+ - "\u010b\u010c\u0005\u001e\u0000\u0000\u010c-\u0001\u0000\u0000\u0000\u010d"+ - "\u010e\u0005#\u0000\u0000\u010e\u010f\u0005\b\u0000\u0000\u010f/\u0001"+ - "\u0000\u0000\u0000\u0110\u0113\u00032\u0019\u0000\u0111\u0113\u00034\u001a"+ - "\u0000\u0112\u0110\u0001\u0000\u0000\u0000\u0112\u0111\u0001\u0000\u0000"+ - "\u0000\u01131\u0001\u0000\u0000\u0000\u0114\u0115\u0005#\u0000\u0000\u0115"+ - "\u0119\u0005 \u0000\u0000\u0116\u0118\u0003.\u0017\u0000\u0117\u0116\u0001"+ - "\u0000\u0000\u0000\u0118\u011b\u0001\u0000\u0000\u0000\u0119\u0117\u0001"+ - "\u0000\u0000\u0000\u0119\u011a\u0001\u0000\u0000\u0000\u011a3\u0001\u0000"+ - "\u0000\u0000\u011b\u0119\u0001\u0000\u0000\u0000\u011c\u011d\u0005\u0017"+ - "\u0000\u0000\u011d\u011e\u0005 \u0000\u0000\u011e\u0123\u0005\u001e\u0000"+ - "\u0000\u011f\u0122\u0003.\u0017\u0000\u0120\u0122\u0003,\u0016\u0000\u0121"+ - "\u011f\u0001\u0000\u0000\u0000\u0121\u0120\u0001\u0000\u0000\u0000\u0122"+ - "\u0125\u0001\u0000\u0000\u0000\u0123\u0121\u0001\u0000\u0000\u0000\u0123"+ - "\u0124\u0001\u0000\u0000\u0000\u01245\u0001\u0000\u0000\u0000\u0125\u0123"+ - "\u0001\u0000\u0000\u0000\u0126\u0129\u00038\u001c\u0000\u0127\u0129\u0003"+ - ":\u001d\u0000\u0128\u0126\u0001\u0000\u0000\u0000\u0128\u0127\u0001\u0000"+ - "\u0000\u0000\u01297\u0001\u0000\u0000\u0000\u012a\u012b\u0007\u0003\u0000"+ - "\u0000\u012b\u012c\u0003\u000e\u0007\u0000\u012c9\u0001\u0000\u0000\u0000"+ - "\u012d\u0130\u0003\u000e\u0007\u0000\u012e\u0130\u00038\u001c\u0000\u012f"+ - "\u012d\u0001\u0000\u0000\u0000\u012f\u012e\u0001\u0000\u0000\u0000\u0130"+ - "\u0131\u0001\u0000\u0000\u0000\u0131\u0134\u0003<\u001e\u0000\u0132\u0135"+ - "\u0003\u000e\u0007\u0000\u0133\u0135\u00036\u001b\u0000\u0134\u0132\u0001"+ - "\u0000\u0000\u0000\u0134\u0133\u0001\u0000\u0000\u0000\u0135;\u0001\u0000"+ - "\u0000\u0000\u0136\u013a\u0003>\u001f\u0000\u0137\u013a\u0003@ \u0000"+ - "\u0138\u013a\u0003B!\u0000\u0139\u0136\u0001\u0000\u0000\u0000\u0139\u0137"+ - "\u0001\u0000\u0000\u0000\u0139\u0138\u0001\u0000\u0000\u0000\u013a=\u0001"+ - "\u0000\u0000\u0000\u013b\u013c\u0007\u0004\u0000\u0000\u013c?\u0001\u0000"+ - "\u0000\u0000\u013d\u013e\u0007\u0005\u0000\u0000\u013eA\u0001\u0000\u0000"+ - "\u0000\u013f\u0140\u0007\u0006\u0000\u0000\u0140C\u0001\u0000\u0000\u0000"+ - "\u0141\u0142\u0005\u0011\u0000\u0000\u0142\u014a\u0005\b\u0000\u0000\u0143"+ - "\u0147\u0005\f\u0000\u0000\u0144\u0146\u0003F#\u0000\u0145\u0144\u0001"+ - "\u0000\u0000\u0000\u0146\u0149\u0001\u0000\u0000\u0000\u0147\u0145\u0001"+ - "\u0000\u0000\u0000\u0147\u0148\u0001\u0000\u0000\u0000\u0148\u014b\u0001"+ - "\u0000\u0000\u0000\u0149\u0147\u0001\u0000\u0000\u0000\u014a\u0143\u0001"+ - "\u0000\u0000\u0000\u014b\u014c\u0001\u0000\u0000\u0000\u014c\u014a\u0001"+ - "\u0000\u0000\u0000\u014c\u014d\u0001\u0000\u0000\u0000\u014d\u014e\u0001"+ - "\u0000\u0000\u0000\u014e\u0158\u0005\b\u0000\u0000\u014f\u0153\u0005\u000f"+ - "\u0000\u0000\u0150\u0152\u0003J%\u0000\u0151\u0150\u0001\u0000\u0000\u0000"+ - "\u0152\u0155\u0001\u0000\u0000\u0000\u0153\u0151\u0001\u0000\u0000\u0000"+ - "\u0153\u0154\u0001\u0000\u0000\u0000\u0154\u0156\u0001\u0000\u0000\u0000"+ - "\u0155\u0153\u0001\u0000\u0000\u0000\u0156\u0158\u0005\u000f\u0000\u0000"+ - "\u0157\u0141\u0001\u0000\u0000\u0000\u0157\u014f\u0001\u0000\u0000\u0000"+ - "\u0158E\u0001\u0000\u0000\u0000\u0159\u015c\u0003N\'\u0000\u015a\u015c"+ - "\u0003H$\u0000\u015b\u0159\u0001\u0000\u0000\u0000\u015b\u015a\u0001\u0000"+ - "\u0000\u0000\u015cG\u0001\u0000\u0000\u0000\u015d\u015e\u0005.\u0000\u0000"+ - "\u015eI\u0001\u0000\u0000\u0000\u015f\u0162\u0003N\'\u0000\u0160\u0162"+ - "\u0003L&\u0000\u0161\u015f\u0001\u0000\u0000\u0000\u0161\u0160\u0001\u0000"+ - "\u0000\u0000\u0162K\u0001\u0000\u0000\u0000\u0163\u0164\u0005,\u0000\u0000"+ - "\u0164M\u0001\u0000\u0000\u0000\u0165\u0166\u0005+\u0000\u0000\u0166\u0167"+ - "\u0003\f\u0006\u0000\u0167\u0168\u0005\u0006\u0000\u0000\u0168O\u0001"+ - "\u0000\u0000\u0000\'UZdns}\u008b\u0093\u0095\u00a0\u00a8\u00ac\u00ae\u00b6"+ - "\u00c3\u00c8\u00cd\u00d1\u00d8\u00e3\u00e6\u00ed\u00fa\u0103\u0107\u0112"+ - "\u0119\u0121\u0123\u0128\u012f\u0134\u0139\u0147\u014c\u0153\u0157\u015b"+ - "\u0161"; + "#\u0007#\u0002$\u0007$\u0002%\u0007%\u0002&\u0007&\u0002\'\u0007\'\u0002"+ + "(\u0007(\u0001\u0000\u0001\u0000\u0001\u0001\u0005\u0001V\b\u0001\n\u0001"+ + "\f\u0001Y\t\u0001\u0001\u0002\u0001\u0002\u0003\u0002]\b\u0002\u0001\u0003"+ + "\u0001\u0003\u0001\u0003\u0001\u0003\u0001\u0004\u0001\u0004\u0005\u0004"+ + "e\b\u0004\n\u0004\f\u0004h\t\u0004\u0001\u0004\u0001\u0004\u0001\u0005"+ + "\u0001\u0005\u0001\u0005\u0001\u0005\u0001\u0005\u0003\u0005q\b\u0005"+ + "\u0001\u0006\u0001\u0006\u0001\u0006\u0003\u0006v\b\u0006\u0001\u0006"+ + "\u0001\u0006\u0001\u0006\u0001\u0006\u0001\u0006\u0001\u0006\u0005\u0006"+ + "~\b\u0006\n\u0006\f\u0006\u0081\t\u0006\u0001\u0007\u0001\u0007\u0001"+ + "\u0007\u0001\u0007\u0001\u0007\u0001\u0007\u0001\u0007\u0001\u0007\u0001"+ + "\u0007\u0001\u0007\u0001\u0007\u0003\u0007\u008e\b\u0007\u0001\u0007\u0001"+ + "\u0007\u0001\u0007\u0001\u0007\u0001\u0007\u0001\u0007\u0001\u0007\u0001"+ + "\u0007\u0005\u0007\u0098\b\u0007\n\u0007\f\u0007\u009b\t\u0007\u0001\b"+ + "\u0001\b\u0001\b\u0001\b\u0001\t\u0001\t\u0001\n\u0001\n\u0003\n\u00a5"+ + "\b\n\u0001\u000b\u0001\u000b\u0001\u000b\u0001\u000b\u0005\u000b\u00ab"+ + "\b\u000b\n\u000b\f\u000b\u00ae\t\u000b\u0001\u000b\u0003\u000b\u00b1\b"+ + "\u000b\u0003\u000b\u00b3\b\u000b\u0001\u000b\u0001\u000b\u0001\f\u0001"+ + "\f\u0005\f\u00b9\b\f\n\f\f\f\u00bc\t\f\u0001\f\u0001\f\u0001\r\u0001\r"+ + "\u0001\r\u0001\r\u0001\r\u0001\r\u0005\r\u00c6\b\r\n\r\f\r\u00c9\t\r\u0001"+ + "\r\u0001\r\u0003\r\u00cd\b\r\u0001\r\u0001\r\u0001\r\u0003\r\u00d2\b\r"+ + "\u0001\u000e\u0001\u000e\u0003\u000e\u00d6\b\u000e\u0001\u000f\u0001\u000f"+ + "\u0001\u000f\u0001\u000f\u0001\u000f\u0003\u000f\u00dd\b\u000f\u0001\u000f"+ + "\u0001\u000f\u0001\u0010\u0001\u0010\u0001\u0010\u0001\u0010\u0001\u0010"+ + "\u0001\u0010\u0001\u0010\u0003\u0010\u00e8\b\u0010\u0001\u0010\u0003\u0010"+ + "\u00eb\b\u0010\u0001\u0010\u0001\u0010\u0001\u0011\u0001\u0011\u0001\u0011"+ + "\u0003\u0011\u00f2\b\u0011\u0001\u0011\u0001\u0011\u0001\u0011\u0001\u0012"+ + "\u0001\u0012\u0001\u0012\u0001\u0013\u0001\u0013\u0001\u0014\u0001\u0014"+ + "\u0001\u0014\u0003\u0014\u00ff\b\u0014\u0001\u0014\u0001\u0014\u0001\u0015"+ + "\u0001\u0015\u0001\u0015\u0005\u0015\u0106\b\u0015\n\u0015\f\u0015\u0109"+ + "\t\u0015\u0001\u0015\u0003\u0015\u010c\b\u0015\u0001\u0016\u0001\u0016"+ + "\u0001\u0016\u0001\u0016\u0001\u0017\u0001\u0017\u0001\u0017\u0001\u0018"+ + "\u0001\u0018\u0001\u0018\u0001\u0019\u0001\u0019\u0003\u0019\u011a\b\u0019"+ + "\u0001\u001a\u0001\u001a\u0001\u001a\u0005\u001a\u011f\b\u001a\n\u001a"+ + "\f\u001a\u0122\t\u001a\u0001\u001b\u0001\u001b\u0001\u001b\u0001\u001b"+ + "\u0001\u001b\u0005\u001b\u0129\b\u001b\n\u001b\f\u001b\u012c\t\u001b\u0001"+ + "\u001c\u0001\u001c\u0003\u001c\u0130\b\u001c\u0001\u001d\u0001\u001d\u0001"+ + "\u001d\u0001\u001e\u0001\u001e\u0003\u001e\u0137\b\u001e\u0001\u001e\u0001"+ + "\u001e\u0001\u001e\u0003\u001e\u013c\b\u001e\u0001\u001f\u0001\u001f\u0001"+ + "\u001f\u0003\u001f\u0141\b\u001f\u0001 \u0001 \u0001!\u0001!\u0001\"\u0001"+ + "\"\u0001#\u0001#\u0001#\u0001#\u0005#\u014d\b#\n#\f#\u0150\t#\u0004#\u0152"+ + "\b#\u000b#\f#\u0153\u0001#\u0001#\u0001#\u0005#\u0159\b#\n#\f#\u015c\t"+ + "#\u0001#\u0003#\u015f\b#\u0001$\u0001$\u0003$\u0163\b$\u0001%\u0001%\u0001"+ + "&\u0001&\u0003&\u0169\b&\u0001\'\u0001\'\u0001(\u0001(\u0001(\u0001(\u0001"+ + "(\u0000\u0002\f\u000e)\u0000\u0002\u0004\u0006\b\n\f\u000e\u0010\u0012"+ + "\u0014\u0016\u0018\u001a\u001c\u001e \"$&(*,.02468:<>@BDFHJLNP\u0000\u0007"+ + "\u0002\u0000\r\u000e\u0010\u0010\u0002\u0000\u0007\u0007\u0016\u0016\u0002"+ + "\u0000\'\'))\u0002\u0000\u0019\u0019!!\u0004\u0000\u0014\u0015\u001b\u001c"+ + "\"\"%%\u0005\u0000\u0012\u0012\u0019\u0019 $$((\u0002\u0000\u0013\u0013"+ + "\u001a\u001a\u0178\u0000R\u0001\u0000\u0000\u0000\u0002W\u0001\u0000\u0000"+ + "\u0000\u0004\\\u0001\u0000\u0000\u0000\u0006^\u0001\u0000\u0000\u0000"+ + "\bb\u0001\u0000\u0000\u0000\np\u0001\u0000\u0000\u0000\fu\u0001\u0000"+ + "\u0000\u0000\u000e\u008d\u0001\u0000\u0000\u0000\u0010\u009c\u0001\u0000"+ + "\u0000\u0000\u0012\u00a0\u0001\u0000\u0000\u0000\u0014\u00a4\u0001\u0000"+ + "\u0000\u0000\u0016\u00a6\u0001\u0000\u0000\u0000\u0018\u00b6\u0001\u0000"+ + "\u0000\u0000\u001a\u00cc\u0001\u0000\u0000\u0000\u001c\u00d5\u0001\u0000"+ + "\u0000\u0000\u001e\u00d7\u0001\u0000\u0000\u0000 \u00e0\u0001\u0000\u0000"+ + "\u0000\"\u00ee\u0001\u0000\u0000\u0000$\u00f6\u0001\u0000\u0000\u0000"+ + "&\u00f9\u0001\u0000\u0000\u0000(\u00fb\u0001\u0000\u0000\u0000*\u0102"+ + "\u0001\u0000\u0000\u0000,\u010d\u0001\u0000\u0000\u0000.\u0111\u0001\u0000"+ + "\u0000\u00000\u0114\u0001\u0000\u0000\u00002\u0119\u0001\u0000\u0000\u0000"+ + "4\u011b\u0001\u0000\u0000\u00006\u0123\u0001\u0000\u0000\u00008\u012f"+ + "\u0001\u0000\u0000\u0000:\u0131\u0001\u0000\u0000\u0000<\u0136\u0001\u0000"+ + "\u0000\u0000>\u0140\u0001\u0000\u0000\u0000@\u0142\u0001\u0000\u0000\u0000"+ + "B\u0144\u0001\u0000\u0000\u0000D\u0146\u0001\u0000\u0000\u0000F\u015e"+ + "\u0001\u0000\u0000\u0000H\u0162\u0001\u0000\u0000\u0000J\u0164\u0001\u0000"+ + "\u0000\u0000L\u0168\u0001\u0000\u0000\u0000N\u016a\u0001\u0000\u0000\u0000"+ + "P\u016c\u0001\u0000\u0000\u0000RS\u0003\u0002\u0001\u0000S\u0001\u0001"+ + "\u0000\u0000\u0000TV\u0003\u0004\u0002\u0000UT\u0001\u0000\u0000\u0000"+ + "VY\u0001\u0000\u0000\u0000WU\u0001\u0000\u0000\u0000WX\u0001\u0000\u0000"+ + "\u0000X\u0003\u0001\u0000\u0000\u0000YW\u0001\u0000\u0000\u0000Z]\u0003"+ + "\u0006\u0003\u0000[]\u0003\b\u0004\u0000\\Z\u0001\u0000\u0000\u0000\\"+ + "[\u0001\u0000\u0000\u0000]\u0005\u0001\u0000\u0000\u0000^_\u0005\b\u0000"+ + "\u0000_`\u0005\u0007\u0000\u0000`a\u0003\f\u0006\u0000a\u0007\u0001\u0000"+ + "\u0000\u0000bf\u0005\b\u0000\u0000ce\u0003\n\u0005\u0000dc\u0001\u0000"+ + "\u0000\u0000eh\u0001\u0000\u0000\u0000fd\u0001\u0000\u0000\u0000fg\u0001"+ + "\u0000\u0000\u0000gi\u0001\u0000\u0000\u0000hf\u0001\u0000\u0000\u0000"+ + "ij\u0003\u0010\b\u0000j\t\u0001\u0000\u0000\u0000kl\u0005\u000f\u0000"+ + "\u0000lm\u0003N\'\u0000mn\u0005\u000f\u0000\u0000nq\u0001\u0000\u0000"+ + "\u0000oq\u0005\b\u0000\u0000pk\u0001\u0000\u0000\u0000po\u0001\u0000\u0000"+ + "\u0000q\u000b\u0001\u0000\u0000\u0000rs\u0006\u0006\uffff\uffff\u0000"+ + "sv\u0003\u000e\u0007\u0000tv\u00038\u001c\u0000ur\u0001\u0000\u0000\u0000"+ + "ut\u0001\u0000\u0000\u0000v\u007f\u0001\u0000\u0000\u0000wx\n\u0001\u0000"+ + "\u0000xy\u0005\u001d\u0000\u0000yz\u0003\f\u0006\u0000z{\u0005\u0016\u0000"+ + "\u0000{|\u0003\f\u0006\u0002|~\u0001\u0000\u0000\u0000}w\u0001\u0000\u0000"+ + "\u0000~\u0081\u0001\u0000\u0000\u0000\u007f}\u0001\u0000\u0000\u0000\u007f"+ + "\u0080\u0001\u0000\u0000\u0000\u0080\r\u0001\u0000\u0000\u0000\u0081\u007f"+ + "\u0001\u0000\u0000\u0000\u0082\u0083\u0006\u0007\uffff\uffff\u0000\u0083"+ + "\u008e\u0003F#\u0000\u0084\u008e\u0003\u0012\t\u0000\u0085\u008e\u0003"+ + "\u001c\u000e\u0000\u0086\u008e\u0003\u0014\n\u0000\u0087\u008e\u0003&"+ + "\u0013\u0000\u0088\u008e\u0003(\u0014\u0000\u0089\u008a\u0005\u0018\u0000"+ + "\u0000\u008a\u008b\u0003\f\u0006\u0000\u008b\u008c\u0005\u001f\u0000\u0000"+ + "\u008c\u008e\u0001\u0000\u0000\u0000\u008d\u0082\u0001\u0000\u0000\u0000"+ + "\u008d\u0084\u0001\u0000\u0000\u0000\u008d\u0085\u0001\u0000\u0000\u0000"+ + "\u008d\u0086\u0001\u0000\u0000\u0000\u008d\u0087\u0001\u0000\u0000\u0000"+ + "\u008d\u0088\u0001\u0000\u0000\u0000\u008d\u0089\u0001\u0000\u0000\u0000"+ + "\u008e\u0099\u0001\u0000\u0000\u0000\u008f\u0090\n\u0005\u0000\u0000\u0090"+ + "\u0098\u0003,\u0016\u0000\u0091\u0092\n\u0004\u0000\u0000\u0092\u0098"+ + "\u0003.\u0017\u0000\u0093\u0094\n\u0003\u0000\u0000\u0094\u0098\u0003"+ + "0\u0018\u0000\u0095\u0096\n\u0002\u0000\u0000\u0096\u0098\u00032\u0019"+ + "\u0000\u0097\u008f\u0001\u0000\u0000\u0000\u0097\u0091\u0001\u0000\u0000"+ + "\u0000\u0097\u0093\u0001\u0000\u0000\u0000\u0097\u0095\u0001\u0000\u0000"+ + "\u0000\u0098\u009b\u0001\u0000\u0000\u0000\u0099\u0097\u0001\u0000\u0000"+ + "\u0000\u0099\u009a\u0001\u0000\u0000\u0000\u009a\u000f\u0001\u0000\u0000"+ + "\u0000\u009b\u0099\u0001\u0000\u0000\u0000\u009c\u009d\u0005\u0005\u0000"+ + "\u0000\u009d\u009e\u0003\u0002\u0001\u0000\u009e\u009f\u0005\u0006\u0000"+ + "\u0000\u009f\u0011\u0001\u0000\u0000\u0000\u00a0\u00a1\u0007\u0000\u0000"+ + "\u0000\u00a1\u0013\u0001\u0000\u0000\u0000\u00a2\u00a5\u0003\u0016\u000b"+ + "\u0000\u00a3\u00a5\u0003\u0018\f\u0000\u00a4\u00a2\u0001\u0000\u0000\u0000"+ + "\u00a4\u00a3\u0001\u0000\u0000\u0000\u00a5\u0015\u0001\u0000\u0000\u0000"+ + "\u00a6\u00b2\u0005\u0017\u0000\u0000\u00a7\u00ac\u0003\f\u0006\u0000\u00a8"+ + "\u00a9\u0005\'\u0000\u0000\u00a9\u00ab\u0003\f\u0006\u0000\u00aa\u00a8"+ + "\u0001\u0000\u0000\u0000\u00ab\u00ae\u0001\u0000\u0000\u0000\u00ac\u00aa"+ + "\u0001\u0000\u0000\u0000\u00ac\u00ad\u0001\u0000\u0000\u0000\u00ad\u00b0"+ + "\u0001\u0000\u0000\u0000\u00ae\u00ac\u0001\u0000\u0000\u0000\u00af\u00b1"+ + "\u0005\'\u0000\u0000\u00b0\u00af\u0001\u0000\u0000\u0000\u00b0\u00b1\u0001"+ + "\u0000\u0000\u0000\u00b1\u00b3\u0001\u0000\u0000\u0000\u00b2\u00a7\u0001"+ + "\u0000\u0000\u0000\u00b2\u00b3\u0001\u0000\u0000\u0000\u00b3\u00b4\u0001"+ + "\u0000\u0000\u0000\u00b4\u00b5\u0005\u001e\u0000\u0000\u00b5\u0017\u0001"+ + "\u0000\u0000\u0000\u00b6\u00ba\u0005\u0005\u0000\u0000\u00b7\u00b9\u0003"+ + "\u001a\r\u0000\u00b8\u00b7\u0001\u0000\u0000\u0000\u00b9\u00bc\u0001\u0000"+ + "\u0000\u0000\u00ba\u00b8\u0001\u0000\u0000\u0000\u00ba\u00bb\u0001\u0000"+ + "\u0000\u0000\u00bb\u00bd\u0001\u0000\u0000\u0000\u00bc\u00ba\u0001\u0000"+ + "\u0000\u0000\u00bd\u00be\u0005\u0006\u0000\u0000\u00be\u0019\u0001\u0000"+ + "\u0000\u0000\u00bf\u00cd\u0005\b\u0000\u0000\u00c0\u00c1\u0005\u0018\u0000"+ + "\u0000\u00c1\u00c2\u0005\b\u0000\u0000\u00c2\u00cd\u0005\u001f\u0000\u0000"+ + "\u00c3\u00c7\u0005\u000f\u0000\u0000\u00c4\u00c6\u0003L&\u0000\u00c5\u00c4"+ + "\u0001\u0000\u0000\u0000\u00c6\u00c9\u0001\u0000\u0000\u0000\u00c7\u00c5"+ + "\u0001\u0000\u0000\u0000\u00c7\u00c8\u0001\u0000\u0000\u0000\u00c8\u00ca"+ + "\u0001\u0000\u0000\u0000\u00c9\u00c7\u0001\u0000\u0000\u0000\u00ca\u00cd"+ + "\u0005\u000f\u0000\u0000\u00cb\u00cd\u0003\f\u0006\u0000\u00cc\u00bf\u0001"+ + "\u0000\u0000\u0000\u00cc\u00c0\u0001\u0000\u0000\u0000\u00cc\u00c3\u0001"+ + "\u0000\u0000\u0000\u00cc\u00cb\u0001\u0000\u0000\u0000\u00cd\u00ce\u0001"+ + "\u0000\u0000\u0000\u00ce\u00cf\u0007\u0001\u0000\u0000\u00cf\u00d1\u0003"+ + "\f\u0006\u0000\u00d0\u00d2\u0005\'\u0000\u0000\u00d1\u00d0\u0001\u0000"+ + "\u0000\u0000\u00d1\u00d2\u0001\u0000\u0000\u0000\u00d2\u001b\u0001\u0000"+ + "\u0000\u0000\u00d3\u00d6\u0003\u001e\u000f\u0000\u00d4\u00d6\u0003 \u0010"+ + "\u0000\u00d5\u00d3\u0001\u0000\u0000\u0000\u00d5\u00d4\u0001\u0000\u0000"+ + "\u0000\u00d6\u001d\u0001\u0000\u0000\u0000\u00d7\u00d8\u0005\u0002\u0000"+ + "\u0000\u00d8\u00d9\u0003\"\u0011\u0000\u00d9\u00da\u0005\u0016\u0000\u0000"+ + "\u00da\u00dc\u0003\f\u0006\u0000\u00db\u00dd\u0003$\u0012\u0000\u00dc"+ + "\u00db\u0001\u0000\u0000\u0000\u00dc\u00dd\u0001\u0000\u0000\u0000\u00dd"+ + "\u00de\u0001\u0000\u0000\u0000\u00de\u00df\u0005\u001e\u0000\u0000\u00df"+ + "\u001f\u0001\u0000\u0000\u0000\u00e0\u00e1\u0005\u0001\u0000\u0000\u00e1"+ + "\u00e2\u0003\"\u0011\u0000\u00e2\u00e3\u0005\u0016\u0000\u0000\u00e3\u00e4"+ + "\u0003\f\u0006\u0000\u00e4\u00e5\u0005&\u0000\u0000\u00e5\u00e7\u0003"+ + "\f\u0006\u0000\u00e6\u00e8\u0005)\u0000\u0000\u00e7\u00e6\u0001\u0000"+ + "\u0000\u0000\u00e7\u00e8\u0001\u0000\u0000\u0000\u00e8\u00ea\u0001\u0000"+ + "\u0000\u0000\u00e9\u00eb\u0003$\u0012\u0000\u00ea\u00e9\u0001\u0000\u0000"+ + "\u0000\u00ea\u00eb\u0001\u0000\u0000\u0000\u00eb\u00ec\u0001\u0000\u0000"+ + "\u0000\u00ec\u00ed\u0005\u0006\u0000\u0000\u00ed!\u0001\u0000\u0000\u0000"+ + "\u00ee\u00f1\u0005\b\u0000\u0000\u00ef\u00f0\u0005\'\u0000\u0000\u00f0"+ + "\u00f2\u0005\b\u0000\u0000\u00f1\u00ef\u0001\u0000\u0000\u0000\u00f1\u00f2"+ + "\u0001\u0000\u0000\u0000\u00f2\u00f3\u0001\u0000\u0000\u0000\u00f3\u00f4"+ + "\u0005\u0004\u0000\u0000\u00f4\u00f5\u0003\f\u0006\u0000\u00f5#\u0001"+ + "\u0000\u0000\u0000\u00f6\u00f7\u0005\u0003\u0000\u0000\u00f7\u00f8\u0003"+ + "\f\u0006\u0000\u00f8%\u0001\u0000\u0000\u0000\u00f9\u00fa\u0005\b\u0000"+ + "\u0000\u00fa\'\u0001\u0000\u0000\u0000\u00fb\u00fc\u0005\b\u0000\u0000"+ + "\u00fc\u00fe\u0005\u0018\u0000\u0000\u00fd\u00ff\u0003*\u0015\u0000\u00fe"+ + "\u00fd\u0001\u0000\u0000\u0000\u00fe\u00ff\u0001\u0000\u0000\u0000\u00ff"+ + "\u0100\u0001\u0000\u0000\u0000\u0100\u0101\u0005\u001f\u0000\u0000\u0101"+ + ")\u0001\u0000\u0000\u0000\u0102\u0107\u0003\f\u0006\u0000\u0103\u0104"+ + "\u0005\'\u0000\u0000\u0104\u0106\u0003\f\u0006\u0000\u0105\u0103\u0001"+ + "\u0000\u0000\u0000\u0106\u0109\u0001\u0000\u0000\u0000\u0107\u0105\u0001"+ + "\u0000\u0000\u0000\u0107\u0108\u0001\u0000\u0000\u0000\u0108\u010b\u0001"+ + "\u0000\u0000\u0000\u0109\u0107\u0001\u0000\u0000\u0000\u010a\u010c\u0007"+ + "\u0002\u0000\u0000\u010b\u010a\u0001\u0000\u0000\u0000\u010b\u010c\u0001"+ + "\u0000\u0000\u0000\u010c+\u0001\u0000\u0000\u0000\u010d\u010e\u0005\u0017"+ + "\u0000\u0000\u010e\u010f\u0003\f\u0006\u0000\u010f\u0110\u0005\u001e\u0000"+ + "\u0000\u0110-\u0001\u0000\u0000\u0000\u0111\u0112\u0005#\u0000\u0000\u0112"+ + "\u0113\u0005\b\u0000\u0000\u0113/\u0001\u0000\u0000\u0000\u0114\u0115"+ + "\u0005#\u0000\u0000\u0115\u0116\u0005\r\u0000\u0000\u01161\u0001\u0000"+ + "\u0000\u0000\u0117\u011a\u00034\u001a\u0000\u0118\u011a\u00036\u001b\u0000"+ + "\u0119\u0117\u0001\u0000\u0000\u0000\u0119\u0118\u0001\u0000\u0000\u0000"+ + "\u011a3\u0001\u0000\u0000\u0000\u011b\u011c\u0005#\u0000\u0000\u011c\u0120"+ + "\u0005 \u0000\u0000\u011d\u011f\u0003.\u0017\u0000\u011e\u011d\u0001\u0000"+ + "\u0000\u0000\u011f\u0122\u0001\u0000\u0000\u0000\u0120\u011e\u0001\u0000"+ + "\u0000\u0000\u0120\u0121\u0001\u0000\u0000\u0000\u01215\u0001\u0000\u0000"+ + "\u0000\u0122\u0120\u0001\u0000\u0000\u0000\u0123\u0124\u0005\u0017\u0000"+ + "\u0000\u0124\u0125\u0005 \u0000\u0000\u0125\u012a\u0005\u001e\u0000\u0000"+ + "\u0126\u0129\u0003.\u0017\u0000\u0127\u0129\u0003,\u0016\u0000\u0128\u0126"+ + "\u0001\u0000\u0000\u0000\u0128\u0127\u0001\u0000\u0000\u0000\u0129\u012c"+ + "\u0001\u0000\u0000\u0000\u012a\u0128\u0001\u0000\u0000\u0000\u012a\u012b"+ + "\u0001\u0000\u0000\u0000\u012b7\u0001\u0000\u0000\u0000\u012c\u012a\u0001"+ + "\u0000\u0000\u0000\u012d\u0130\u0003:\u001d\u0000\u012e\u0130\u0003<\u001e"+ + "\u0000\u012f\u012d\u0001\u0000\u0000\u0000\u012f\u012e\u0001\u0000\u0000"+ + "\u0000\u01309\u0001\u0000\u0000\u0000\u0131\u0132\u0007\u0003\u0000\u0000"+ + "\u0132\u0133\u0003\u000e\u0007\u0000\u0133;\u0001\u0000\u0000\u0000\u0134"+ + "\u0137\u0003\u000e\u0007\u0000\u0135\u0137\u0003:\u001d\u0000\u0136\u0134"+ + "\u0001\u0000\u0000\u0000\u0136\u0135\u0001\u0000\u0000\u0000\u0137\u0138"+ + "\u0001\u0000\u0000\u0000\u0138\u013b\u0003>\u001f\u0000\u0139\u013c\u0003"+ + "\u000e\u0007\u0000\u013a\u013c\u00038\u001c\u0000\u013b\u0139\u0001\u0000"+ + "\u0000\u0000\u013b\u013a\u0001\u0000\u0000\u0000\u013c=\u0001\u0000\u0000"+ + "\u0000\u013d\u0141\u0003@ \u0000\u013e\u0141\u0003B!\u0000\u013f\u0141"+ + "\u0003D\"\u0000\u0140\u013d\u0001\u0000\u0000\u0000\u0140\u013e\u0001"+ + "\u0000\u0000\u0000\u0140\u013f\u0001\u0000\u0000\u0000\u0141?\u0001\u0000"+ + "\u0000\u0000\u0142\u0143\u0007\u0004\u0000\u0000\u0143A\u0001\u0000\u0000"+ + "\u0000\u0144\u0145\u0007\u0005\u0000\u0000\u0145C\u0001\u0000\u0000\u0000"+ + "\u0146\u0147\u0007\u0006\u0000\u0000\u0147E\u0001\u0000\u0000\u0000\u0148"+ + "\u0149\u0005\u0011\u0000\u0000\u0149\u0151\u0005\b\u0000\u0000\u014a\u014e"+ + "\u0005\f\u0000\u0000\u014b\u014d\u0003H$\u0000\u014c\u014b\u0001\u0000"+ + "\u0000\u0000\u014d\u0150\u0001\u0000\u0000\u0000\u014e\u014c\u0001\u0000"+ + "\u0000\u0000\u014e\u014f\u0001\u0000\u0000\u0000\u014f\u0152\u0001\u0000"+ + "\u0000\u0000\u0150\u014e\u0001\u0000\u0000\u0000\u0151\u014a\u0001\u0000"+ + "\u0000\u0000\u0152\u0153\u0001\u0000\u0000\u0000\u0153\u0151\u0001\u0000"+ + "\u0000\u0000\u0153\u0154\u0001\u0000\u0000\u0000\u0154\u0155\u0001\u0000"+ + "\u0000\u0000\u0155\u015f\u0005\b\u0000\u0000\u0156\u015a\u0005\u000f\u0000"+ + "\u0000\u0157\u0159\u0003L&\u0000\u0158\u0157\u0001\u0000\u0000\u0000\u0159"+ + "\u015c\u0001\u0000\u0000\u0000\u015a\u0158\u0001\u0000\u0000\u0000\u015a"+ + "\u015b\u0001\u0000\u0000\u0000\u015b\u015d\u0001\u0000\u0000\u0000\u015c"+ + "\u015a\u0001\u0000\u0000\u0000\u015d\u015f\u0005\u000f\u0000\u0000\u015e"+ + "\u0148\u0001\u0000\u0000\u0000\u015e\u0156\u0001\u0000\u0000\u0000\u015f"+ + "G\u0001\u0000\u0000\u0000\u0160\u0163\u0003P(\u0000\u0161\u0163\u0003"+ + "J%\u0000\u0162\u0160\u0001\u0000\u0000\u0000\u0162\u0161\u0001\u0000\u0000"+ + "\u0000\u0163I\u0001\u0000\u0000\u0000\u0164\u0165\u0005.\u0000\u0000\u0165"+ + "K\u0001\u0000\u0000\u0000\u0166\u0169\u0003P(\u0000\u0167\u0169\u0003"+ + "N\'\u0000\u0168\u0166\u0001\u0000\u0000\u0000\u0168\u0167\u0001\u0000"+ + "\u0000\u0000\u0169M\u0001\u0000\u0000\u0000\u016a\u016b\u0005,\u0000\u0000"+ + "\u016bO\u0001\u0000\u0000\u0000\u016c\u016d\u0005+\u0000\u0000\u016d\u016e"+ + "\u0003\f\u0006\u0000\u016e\u016f\u0005\u0006\u0000\u0000\u016fQ\u0001"+ + "\u0000\u0000\u0000\'W\\fpu\u007f\u008d\u0097\u0099\u00a4\u00ac\u00b0\u00b2"+ + "\u00ba\u00c7\u00cc\u00d1\u00d5\u00dc\u00e7\u00ea\u00f1\u00fe\u0107\u010b"+ + "\u0119\u0120\u0128\u012a\u012f\u0136\u013b\u0140\u014e\u0153\u015a\u015e"+ + "\u0162\u0168"; public static final ATN _ATN = new ATNDeserializer().deserialize(_serializedATN.toCharArray()); static { diff --git a/rewrite-hcl/src/main/java/org/openrewrite/hcl/internal/grammar/HCLParserBaseListener.java b/rewrite-hcl/src/main/java/org/openrewrite/hcl/internal/grammar/HCLParserBaseListener.java index 955f095e365..0d44480c791 100644 --- a/rewrite-hcl/src/main/java/org/openrewrite/hcl/internal/grammar/HCLParserBaseListener.java +++ b/rewrite-hcl/src/main/java/org/openrewrite/hcl/internal/grammar/HCLParserBaseListener.java @@ -219,6 +219,18 @@ public class HCLParserBaseListener implements HCLParserListener { *

The default implementation does nothing.

*/ @Override public void exitIndexAccessExpression(HCLParser.IndexAccessExpressionContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterLegacyIndexAttributeExpression(HCLParser.LegacyIndexAttributeExpressionContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitLegacyIndexAttributeExpression(HCLParser.LegacyIndexAttributeExpressionContext ctx) { } /** * {@inheritDoc} * @@ -447,6 +459,18 @@ public class HCLParserBaseListener implements HCLParserListener { *

The default implementation does nothing.

*/ @Override public void exitGetAttr(HCLParser.GetAttrContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterLegacyIndexAttr(HCLParser.LegacyIndexAttrContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitLegacyIndexAttr(HCLParser.LegacyIndexAttrContext ctx) { } /** * {@inheritDoc} * diff --git a/rewrite-hcl/src/main/java/org/openrewrite/hcl/internal/grammar/HCLParserBaseVisitor.java b/rewrite-hcl/src/main/java/org/openrewrite/hcl/internal/grammar/HCLParserBaseVisitor.java index 5add2c1566f..cc3e91b9973 100644 --- a/rewrite-hcl/src/main/java/org/openrewrite/hcl/internal/grammar/HCLParserBaseVisitor.java +++ b/rewrite-hcl/src/main/java/org/openrewrite/hcl/internal/grammar/HCLParserBaseVisitor.java @@ -139,6 +139,13 @@ public class HCLParserBaseVisitor extends AbstractParseTreeVisitor impleme * {@link #visitChildren} on {@code ctx}.

*/ @Override public T visitIndexAccessExpression(HCLParser.IndexAccessExpressionContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

+ */ + @Override public T visitLegacyIndexAttributeExpression(HCLParser.LegacyIndexAttributeExpressionContext ctx) { return visitChildren(ctx); } /** * {@inheritDoc} * @@ -272,6 +279,13 @@ public class HCLParserBaseVisitor extends AbstractParseTreeVisitor impleme * {@link #visitChildren} on {@code ctx}.

*/ @Override public T visitGetAttr(HCLParser.GetAttrContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

+ */ + @Override public T visitLegacyIndexAttr(HCLParser.LegacyIndexAttrContext ctx) { return visitChildren(ctx); } /** * {@inheritDoc} * diff --git a/rewrite-hcl/src/main/java/org/openrewrite/hcl/internal/grammar/HCLParserListener.java b/rewrite-hcl/src/main/java/org/openrewrite/hcl/internal/grammar/HCLParserListener.java index c73e9f70565..6725c41ed20 100644 --- a/rewrite-hcl/src/main/java/org/openrewrite/hcl/internal/grammar/HCLParserListener.java +++ b/rewrite-hcl/src/main/java/org/openrewrite/hcl/internal/grammar/HCLParserListener.java @@ -202,6 +202,18 @@ public interface HCLParserListener extends ParseTreeListener { * @param ctx the parse tree */ void exitIndexAccessExpression(HCLParser.IndexAccessExpressionContext ctx); + /** + * Enter a parse tree produced by the {@code LegacyIndexAttributeExpression} + * labeled alternative in {@link HCLParser#exprTerm}. + * @param ctx the parse tree + */ + void enterLegacyIndexAttributeExpression(HCLParser.LegacyIndexAttributeExpressionContext ctx); + /** + * Exit a parse tree produced by the {@code LegacyIndexAttributeExpression} + * labeled alternative in {@link HCLParser#exprTerm}. + * @param ctx the parse tree + */ + void exitLegacyIndexAttributeExpression(HCLParser.LegacyIndexAttributeExpressionContext ctx); /** * Enter a parse tree produced by the {@code ForExpression} * labeled alternative in {@link HCLParser#exprTerm}. @@ -398,6 +410,16 @@ public interface HCLParserListener extends ParseTreeListener { * @param ctx the parse tree */ void exitGetAttr(HCLParser.GetAttrContext ctx); + /** + * Enter a parse tree produced by {@link HCLParser#legacyIndexAttr}. + * @param ctx the parse tree + */ + void enterLegacyIndexAttr(HCLParser.LegacyIndexAttrContext ctx); + /** + * Exit a parse tree produced by {@link HCLParser#legacyIndexAttr}. + * @param ctx the parse tree + */ + void exitLegacyIndexAttr(HCLParser.LegacyIndexAttrContext ctx); /** * Enter a parse tree produced by {@link HCLParser#splat}. * @param ctx the parse tree diff --git a/rewrite-hcl/src/main/java/org/openrewrite/hcl/internal/grammar/HCLParserVisitor.java b/rewrite-hcl/src/main/java/org/openrewrite/hcl/internal/grammar/HCLParserVisitor.java index 531e35db3bc..f1a5f11d588 100644 --- a/rewrite-hcl/src/main/java/org/openrewrite/hcl/internal/grammar/HCLParserVisitor.java +++ b/rewrite-hcl/src/main/java/org/openrewrite/hcl/internal/grammar/HCLParserVisitor.java @@ -131,6 +131,13 @@ public interface HCLParserVisitor extends ParseTreeVisitor { * @return the visitor result */ T visitIndexAccessExpression(HCLParser.IndexAccessExpressionContext ctx); + /** + * Visit a parse tree produced by the {@code LegacyIndexAttributeExpression} + * labeled alternative in {@link HCLParser#exprTerm}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitLegacyIndexAttributeExpression(HCLParser.LegacyIndexAttributeExpressionContext ctx); /** * Visit a parse tree produced by the {@code ForExpression} * labeled alternative in {@link HCLParser#exprTerm}. @@ -248,6 +255,12 @@ public interface HCLParserVisitor extends ParseTreeVisitor { * @return the visitor result */ T visitGetAttr(HCLParser.GetAttrContext ctx); + /** + * Visit a parse tree produced by {@link HCLParser#legacyIndexAttr}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitLegacyIndexAttr(HCLParser.LegacyIndexAttrContext ctx); /** * Visit a parse tree produced by {@link HCLParser#splat}. * @param ctx the parse tree diff --git a/rewrite-hcl/src/main/java/org/openrewrite/hcl/tree/Hcl.java b/rewrite-hcl/src/main/java/org/openrewrite/hcl/tree/Hcl.java index 8ee49114969..d58fbfec844 100644 --- a/rewrite-hcl/src/main/java/org/openrewrite/hcl/tree/Hcl.java +++ b/rewrite-hcl/src/main/java/org/openrewrite/hcl/tree/Hcl.java @@ -26,7 +26,6 @@ import org.openrewrite.hcl.internal.HclPrinter; import org.openrewrite.internal.ListUtils; import org.openrewrite.marker.Markers; -import org.openrewrite.template.SourceTemplate; import java.lang.ref.WeakReference; import java.nio.charset.Charset; @@ -236,6 +235,67 @@ public AttributeAccess withName(HclLeftPadded name) { } } + @FieldDefaults(makeFinal = true, level = AccessLevel.PRIVATE) + @EqualsAndHashCode(callSuper = false, onlyExplicitlyIncluded = true) + @RequiredArgsConstructor + @AllArgsConstructor(access = AccessLevel.PRIVATE) + class LegacyIndexAttributeAccess implements Expression, Label { + @Nullable + @NonFinal + transient WeakReference padding; + + @With + @EqualsAndHashCode.Include + @Getter + UUID id; + + @With + @Getter + Space prefix; + + @With + @Getter + Markers markers; + + @With + @Getter + Expression base; + + @With + @Getter + String index; + + @Override + public

Hcl acceptHcl(HclVisitor

v, P p) { + return v.visitLegacyIndexAttribute(this, p); + } + + @Override + public String toString() { + return "LegacyIndexAttributeAccess{" + base + "." + index + "}"; + } + + public Padding getPadding() { + Padding p; + if (this.padding == null) { + p = new Padding(this); + this.padding = new WeakReference<>(p); + } else { + p = this.padding.get(); + if (p == null || p.t != this) { + p = new Padding(this); + this.padding = new WeakReference<>(p); + } + } + return p; + } + + @RequiredArgsConstructor + public static class Padding { + private final LegacyIndexAttributeAccess t; + } + } + @FieldDefaults(makeFinal = true, level = AccessLevel.PRIVATE) @EqualsAndHashCode(callSuper = false, onlyExplicitlyIncluded = true) @RequiredArgsConstructor diff --git a/rewrite-hcl/src/test/java/org/openrewrite/hcl/tree/HclVariableExpressionTest.java b/rewrite-hcl/src/test/java/org/openrewrite/hcl/tree/HclVariableExpressionTest.java index 353d4c43b86..86c10391603 100644 --- a/rewrite-hcl/src/test/java/org/openrewrite/hcl/tree/HclVariableExpressionTest.java +++ b/rewrite-hcl/src/test/java/org/openrewrite/hcl/tree/HclVariableExpressionTest.java @@ -33,4 +33,17 @@ void variableExpression() { ) ); } + + @Test + void legacyIndexOperator() { + rewriteRun( + hcl( + """ + locals { + dns_record = aws_acm_certificate.google_dot_com.0.resource_record_name + } + """ + ) + ); + } }