From 8ac32352240b6c54cd38de3e4888b018bef8a13d Mon Sep 17 00:00:00 2001 From: Jessy Mallet Date: Tue, 13 Aug 2024 10:49:27 +0200 Subject: [PATCH] [639] Support direct edit for Usage element Bug: https://github.com/eclipse-syson/syson/issues/639 Signed-off-by: Jessy Mallet --- CHANGELOG.adoc | 3 +- .../syson/services/grammars/DirectEdit.interp | 44 +- .../syson/services/grammars/DirectEdit.tokens | 347 ++--- .../grammars/DirectEditBaseListener.java | 120 ++ .../services/grammars/DirectEditLexer.interp | 52 +- .../services/grammars/DirectEditLexer.java | 1304 +++++++++-------- .../services/grammars/DirectEditLexer.tokens | 347 ++--- .../services/grammars/DirectEditListener.java | 100 ++ .../services/grammars/DirectEditParser.java | 1141 +++++++++++---- .../services/DiagramDirectEditListener.java | 174 +++ .../src/main/resources/DirectEdit.g4 | 63 +- .../pages/release-notes/2024.9.0.adoc | 3 + .../general-view/directEditTests.cy.ts | 90 +- .../cypress/workbench/Details.ts | 8 +- 14 files changed, 2531 insertions(+), 1265 deletions(-) diff --git a/CHANGELOG.adoc b/CHANGELOG.adoc index c1d710492..f7a64261d 100644 --- a/CHANGELOG.adoc +++ b/CHANGELOG.adoc @@ -85,7 +85,8 @@ The second one called "New ExhibitState with referenced State" shows a dialog al - https://github.com/eclipse-syson/syson/issues/628[#628] [diagrams] Allow to set measurement units via direct edit. - https://github.com/eclipse-syson/syson/issues/634[#634] [diagrams] Allow to select existing _Type_ on Subject tool. - https://github.com/eclipse-syson/syson/issues/639[#639] [diagrams] Handle properties keywords in label of Usage element. - +- https://github.com/eclipse-syson/syson/issues/639[#639] [diagrams] Allow direct edit of properties of Usage elements. +The supported properties are `in`, `out`, `inout`, `abstract`, `variation`, `readonly`, `derived`, `end`, `ordered`, and `nonunique`. === New features diff --git a/backend/services/syson-services/src/main/generated/org/eclipse/syson/services/grammars/DirectEdit.interp b/backend/services/syson-services/src/main/generated/org/eclipse/syson/services/grammars/DirectEdit.interp index fdcb9e221..f0f26e239 100644 --- a/backend/services/syson-services/src/main/generated/org/eclipse/syson/services/grammars/DirectEdit.interp +++ b/backend/services/syson-services/src/main/generated/org/eclipse/syson/services/grammars/DirectEdit.interp @@ -1,6 +1,5 @@ token literal names: null -'ref ' '[' '..' ']' @@ -21,6 +20,7 @@ null null 'about' 'abstract' +null 'alias' 'all' 'and' @@ -44,12 +44,14 @@ null 'default' 'dependency' 'derived' +null 'differences' 'disjoining' 'disjoint' 'doc' 'else' 'end' +null 'expr' 'false' 'feature' @@ -67,7 +69,9 @@ null 'implies' 'import' 'in' +null 'inout' +null 'interaction' 'inv' 'inverse' @@ -80,12 +84,15 @@ null 'multiplicity' 'namespace' 'nonunique' +null 'not' 'null' 'of' 'or' 'ordered' +null 'out' +null 'package' 'portion' 'predicate' @@ -93,8 +100,11 @@ null 'protected' 'public' 'readonly' +null 'redefines' 'redefinition' +'ref' +null 'references' 'rep' 'return' @@ -114,6 +124,8 @@ null 'typed' 'typing' 'unions' +'variation' +null 'xor' null @@ -132,7 +144,6 @@ null null null null -null WS Boolean Integer @@ -140,6 +151,7 @@ Real DoubleQuotedString ABOUT ABSTRACT +ABSTRACT_PREFIX ALIAS ALL AND @@ -163,12 +175,14 @@ DATATYPE DEFAULT DEPENDENCY DERIVED +DERIVED_PREFIX DIFFERENCES DISJOINING DISJOINT DOC ELSE END +END_PREFIX EXPR FALSE FEATURE @@ -186,7 +200,9 @@ INTERSECTS IMPLIES IMPORT IN -INPUT +IN_PREFIX +INOUT +INOUT_PREFIX INTERACTION INV INVERSE @@ -199,12 +215,15 @@ METADATA MULTIPLICITY NAMESPACE NONUNIQUE +NONUNIQUE_SUFFIX NOT NULL OF OR ORDERED +ORDERED_SUFFIX OUT +OUT_PREFIX PACKAGE PORTION PREDICATE @@ -212,9 +231,12 @@ PRIAVTE PROTECTED PUBLIC READONLY +READONLY_PREFIX REDEFINES REDEFINITION -RFERENCES +REF +REF_PREFIX +REFERENCES REP RETURN SPECIALIZTION @@ -233,13 +255,25 @@ TYPE TYPED TYPING UNIONS +VARIATION +VARIATION_PREFIX XOR ANY rule names: expression +prefixExpression +directionPrefixExpression +abstractPrefixExpression +variationPrefixExpression +readonlyPrefixExpression +derivedPrefixExpression +endPrefixExpression referenceExpression multiplicityExpression +multiplicityPropExpression +orderedMultiplicityExpression +nonuniqueMultiplicityExpression multiplicityExpressionMember featureExpressions subsettingExpression @@ -257,4 +291,4 @@ name atn: -[4, 1, 116, 151, 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, 1, 0, 3, 0, 36, 8, 0, 1, 0, 3, 0, 39, 8, 0, 1, 0, 3, 0, 42, 8, 0, 1, 0, 1, 0, 1, 0, 1, 1, 1, 1, 1, 2, 1, 2, 1, 2, 1, 2, 3, 2, 53, 8, 2, 1, 2, 1, 2, 1, 2, 1, 3, 1, 3, 1, 4, 1, 4, 3, 4, 62, 8, 4, 1, 4, 3, 4, 65, 8, 4, 1, 4, 3, 4, 68, 8, 4, 1, 4, 3, 4, 71, 8, 4, 1, 4, 1, 4, 3, 4, 75, 8, 4, 1, 4, 3, 4, 78, 8, 4, 3, 4, 80, 8, 4, 1, 5, 1, 5, 1, 5, 1, 6, 1, 6, 1, 6, 1, 7, 1, 7, 1, 7, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 3, 8, 97, 8, 8, 1, 9, 4, 9, 100, 8, 9, 11, 9, 12, 9, 101, 1, 10, 3, 10, 105, 8, 10, 1, 10, 3, 10, 108, 8, 10, 1, 10, 3, 10, 111, 8, 10, 1, 11, 1, 11, 1, 11, 5, 11, 116, 8, 11, 10, 11, 12, 11, 119, 9, 11, 1, 12, 1, 12, 3, 12, 123, 8, 12, 1, 13, 1, 13, 1, 13, 1, 13, 1, 14, 1, 14, 1, 14, 1, 14, 5, 14, 133, 8, 14, 10, 14, 12, 14, 136, 9, 14, 1, 15, 1, 15, 1, 15, 5, 15, 141, 8, 15, 10, 15, 12, 15, 144, 9, 15, 1, 16, 4, 16, 147, 8, 16, 11, 16, 12, 16, 148, 1, 16, 0, 0, 17, 0, 2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30, 32, 0, 4, 2, 0, 5, 5, 17, 17, 1, 0, 16, 19, 1, 0, 4, 4, 3, 0, 1, 2, 6, 9, 14, 14, 156, 0, 35, 1, 0, 0, 0, 2, 46, 1, 0, 0, 0, 4, 48, 1, 0, 0, 0, 6, 57, 1, 0, 0, 0, 8, 79, 1, 0, 0, 0, 10, 81, 1, 0, 0, 0, 12, 84, 1, 0, 0, 0, 14, 87, 1, 0, 0, 0, 16, 90, 1, 0, 0, 0, 18, 99, 1, 0, 0, 0, 20, 104, 1, 0, 0, 0, 22, 112, 1, 0, 0, 0, 24, 120, 1, 0, 0, 0, 26, 124, 1, 0, 0, 0, 28, 128, 1, 0, 0, 0, 30, 137, 1, 0, 0, 0, 32, 146, 1, 0, 0, 0, 34, 36, 3, 2, 1, 0, 35, 34, 1, 0, 0, 0, 35, 36, 1, 0, 0, 0, 36, 38, 1, 0, 0, 0, 37, 39, 3, 32, 16, 0, 38, 37, 1, 0, 0, 0, 38, 39, 1, 0, 0, 0, 39, 41, 1, 0, 0, 0, 40, 42, 3, 4, 2, 0, 41, 40, 1, 0, 0, 0, 41, 42, 1, 0, 0, 0, 42, 43, 1, 0, 0, 0, 43, 44, 3, 8, 4, 0, 44, 45, 5, 0, 0, 1, 45, 1, 1, 0, 0, 0, 46, 47, 5, 1, 0, 0, 47, 3, 1, 0, 0, 0, 48, 52, 5, 2, 0, 0, 49, 50, 3, 6, 3, 0, 50, 51, 5, 3, 0, 0, 51, 53, 1, 0, 0, 0, 52, 49, 1, 0, 0, 0, 52, 53, 1, 0, 0, 0, 53, 54, 1, 0, 0, 0, 54, 55, 3, 6, 3, 0, 55, 56, 5, 4, 0, 0, 56, 5, 1, 0, 0, 0, 57, 58, 7, 0, 0, 0, 58, 7, 1, 0, 0, 0, 59, 62, 3, 10, 5, 0, 60, 62, 3, 12, 6, 0, 61, 59, 1, 0, 0, 0, 61, 60, 1, 0, 0, 0, 61, 62, 1, 0, 0, 0, 62, 64, 1, 0, 0, 0, 63, 65, 3, 14, 7, 0, 64, 63, 1, 0, 0, 0, 64, 65, 1, 0, 0, 0, 65, 67, 1, 0, 0, 0, 66, 68, 3, 16, 8, 0, 67, 66, 1, 0, 0, 0, 67, 68, 1, 0, 0, 0, 68, 80, 1, 0, 0, 0, 69, 71, 3, 14, 7, 0, 70, 69, 1, 0, 0, 0, 70, 71, 1, 0, 0, 0, 71, 74, 1, 0, 0, 0, 72, 75, 3, 10, 5, 0, 73, 75, 3, 12, 6, 0, 74, 72, 1, 0, 0, 0, 74, 73, 1, 0, 0, 0, 74, 75, 1, 0, 0, 0, 75, 77, 1, 0, 0, 0, 76, 78, 3, 16, 8, 0, 77, 76, 1, 0, 0, 0, 77, 78, 1, 0, 0, 0, 78, 80, 1, 0, 0, 0, 79, 61, 1, 0, 0, 0, 79, 70, 1, 0, 0, 0, 80, 9, 1, 0, 0, 0, 81, 82, 5, 6, 0, 0, 82, 83, 3, 30, 15, 0, 83, 11, 1, 0, 0, 0, 84, 85, 5, 7, 0, 0, 85, 86, 3, 30, 15, 0, 86, 13, 1, 0, 0, 0, 87, 88, 5, 8, 0, 0, 88, 89, 3, 30, 15, 0, 89, 15, 1, 0, 0, 0, 90, 91, 5, 9, 0, 0, 91, 96, 7, 1, 0, 0, 92, 93, 5, 2, 0, 0, 93, 94, 3, 18, 9, 0, 94, 95, 5, 4, 0, 0, 95, 97, 1, 0, 0, 0, 96, 92, 1, 0, 0, 0, 96, 97, 1, 0, 0, 0, 97, 17, 1, 0, 0, 0, 98, 100, 8, 2, 0, 0, 99, 98, 1, 0, 0, 0, 100, 101, 1, 0, 0, 0, 101, 99, 1, 0, 0, 0, 101, 102, 1, 0, 0, 0, 102, 19, 1, 0, 0, 0, 103, 105, 3, 22, 11, 0, 104, 103, 1, 0, 0, 0, 104, 105, 1, 0, 0, 0, 105, 107, 1, 0, 0, 0, 106, 108, 3, 26, 13, 0, 107, 106, 1, 0, 0, 0, 107, 108, 1, 0, 0, 0, 108, 110, 1, 0, 0, 0, 109, 111, 3, 28, 14, 0, 110, 109, 1, 0, 0, 0, 110, 111, 1, 0, 0, 0, 111, 21, 1, 0, 0, 0, 112, 117, 3, 24, 12, 0, 113, 114, 5, 10, 0, 0, 114, 116, 3, 24, 12, 0, 115, 113, 1, 0, 0, 0, 116, 119, 1, 0, 0, 0, 117, 115, 1, 0, 0, 0, 117, 118, 1, 0, 0, 0, 118, 23, 1, 0, 0, 0, 119, 117, 1, 0, 0, 0, 120, 122, 3, 32, 16, 0, 121, 123, 3, 14, 7, 0, 122, 121, 1, 0, 0, 0, 122, 123, 1, 0, 0, 0, 123, 25, 1, 0, 0, 0, 124, 125, 5, 2, 0, 0, 125, 126, 3, 16, 8, 0, 126, 127, 5, 4, 0, 0, 127, 27, 1, 0, 0, 0, 128, 129, 5, 11, 0, 0, 129, 134, 3, 30, 15, 0, 130, 131, 5, 12, 0, 0, 131, 133, 3, 30, 15, 0, 132, 130, 1, 0, 0, 0, 133, 136, 1, 0, 0, 0, 134, 132, 1, 0, 0, 0, 134, 135, 1, 0, 0, 0, 135, 29, 1, 0, 0, 0, 136, 134, 1, 0, 0, 0, 137, 142, 3, 32, 16, 0, 138, 139, 5, 13, 0, 0, 139, 141, 3, 32, 16, 0, 140, 138, 1, 0, 0, 0, 141, 144, 1, 0, 0, 0, 142, 140, 1, 0, 0, 0, 142, 143, 1, 0, 0, 0, 143, 31, 1, 0, 0, 0, 144, 142, 1, 0, 0, 0, 145, 147, 8, 3, 0, 0, 146, 145, 1, 0, 0, 0, 147, 148, 1, 0, 0, 0, 148, 146, 1, 0, 0, 0, 148, 149, 1, 0, 0, 0, 149, 33, 1, 0, 0, 0, 21, 35, 38, 41, 52, 61, 64, 67, 70, 74, 77, 79, 96, 101, 104, 107, 110, 117, 122, 134, 142, 148] \ No newline at end of file +[4, 1, 128, 217, 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, 1, 0, 3, 0, 56, 8, 0, 1, 0, 3, 0, 59, 8, 0, 1, 0, 3, 0, 62, 8, 0, 1, 0, 3, 0, 65, 8, 0, 1, 0, 3, 0, 68, 8, 0, 1, 0, 1, 0, 1, 0, 1, 1, 3, 1, 74, 8, 1, 1, 1, 3, 1, 77, 8, 1, 1, 1, 3, 1, 80, 8, 1, 1, 1, 3, 1, 83, 8, 1, 1, 1, 3, 1, 86, 8, 1, 1, 1, 3, 1, 89, 8, 1, 1, 2, 1, 2, 1, 3, 1, 3, 1, 4, 1, 4, 1, 5, 1, 5, 1, 6, 1, 6, 1, 7, 1, 7, 1, 8, 1, 8, 1, 9, 1, 9, 1, 9, 1, 9, 3, 9, 109, 8, 9, 1, 9, 1, 9, 1, 9, 1, 10, 3, 10, 115, 8, 10, 1, 10, 3, 10, 118, 8, 10, 1, 11, 1, 11, 1, 12, 1, 12, 1, 13, 1, 13, 1, 14, 1, 14, 3, 14, 128, 8, 14, 1, 14, 3, 14, 131, 8, 14, 1, 14, 3, 14, 134, 8, 14, 1, 14, 3, 14, 137, 8, 14, 1, 14, 1, 14, 3, 14, 141, 8, 14, 1, 14, 3, 14, 144, 8, 14, 3, 14, 146, 8, 14, 1, 15, 1, 15, 1, 15, 1, 16, 1, 16, 1, 16, 1, 17, 1, 17, 1, 17, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 3, 18, 163, 8, 18, 1, 19, 4, 19, 166, 8, 19, 11, 19, 12, 19, 167, 1, 20, 3, 20, 171, 8, 20, 1, 20, 3, 20, 174, 8, 20, 1, 20, 3, 20, 177, 8, 20, 1, 21, 1, 21, 1, 21, 5, 21, 182, 8, 21, 10, 21, 12, 21, 185, 9, 21, 1, 22, 1, 22, 3, 22, 189, 8, 22, 1, 23, 1, 23, 1, 23, 1, 23, 1, 24, 1, 24, 1, 24, 1, 24, 5, 24, 199, 8, 24, 10, 24, 12, 24, 202, 9, 24, 1, 25, 1, 25, 1, 25, 5, 25, 207, 8, 25, 10, 25, 12, 25, 210, 9, 25, 1, 26, 4, 26, 213, 8, 26, 11, 26, 12, 26, 214, 1, 26, 0, 0, 27, 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, 0, 5, 3, 0, 70, 70, 72, 72, 93, 93, 2, 0, 4, 4, 16, 16, 1, 0, 15, 18, 1, 0, 3, 3, 5, 0, 1, 1, 5, 8, 13, 13, 85, 85, 91, 91, 222, 0, 55, 1, 0, 0, 0, 2, 73, 1, 0, 0, 0, 4, 90, 1, 0, 0, 0, 6, 92, 1, 0, 0, 0, 8, 94, 1, 0, 0, 0, 10, 96, 1, 0, 0, 0, 12, 98, 1, 0, 0, 0, 14, 100, 1, 0, 0, 0, 16, 102, 1, 0, 0, 0, 18, 104, 1, 0, 0, 0, 20, 114, 1, 0, 0, 0, 22, 119, 1, 0, 0, 0, 24, 121, 1, 0, 0, 0, 26, 123, 1, 0, 0, 0, 28, 145, 1, 0, 0, 0, 30, 147, 1, 0, 0, 0, 32, 150, 1, 0, 0, 0, 34, 153, 1, 0, 0, 0, 36, 156, 1, 0, 0, 0, 38, 165, 1, 0, 0, 0, 40, 170, 1, 0, 0, 0, 42, 178, 1, 0, 0, 0, 44, 186, 1, 0, 0, 0, 46, 190, 1, 0, 0, 0, 48, 194, 1, 0, 0, 0, 50, 203, 1, 0, 0, 0, 52, 212, 1, 0, 0, 0, 54, 56, 3, 2, 1, 0, 55, 54, 1, 0, 0, 0, 55, 56, 1, 0, 0, 0, 56, 58, 1, 0, 0, 0, 57, 59, 3, 16, 8, 0, 58, 57, 1, 0, 0, 0, 58, 59, 1, 0, 0, 0, 59, 61, 1, 0, 0, 0, 60, 62, 3, 52, 26, 0, 61, 60, 1, 0, 0, 0, 61, 62, 1, 0, 0, 0, 62, 64, 1, 0, 0, 0, 63, 65, 3, 18, 9, 0, 64, 63, 1, 0, 0, 0, 64, 65, 1, 0, 0, 0, 65, 67, 1, 0, 0, 0, 66, 68, 3, 20, 10, 0, 67, 66, 1, 0, 0, 0, 67, 68, 1, 0, 0, 0, 68, 69, 1, 0, 0, 0, 69, 70, 3, 28, 14, 0, 70, 71, 5, 0, 0, 1, 71, 1, 1, 0, 0, 0, 72, 74, 3, 4, 2, 0, 73, 72, 1, 0, 0, 0, 73, 74, 1, 0, 0, 0, 74, 76, 1, 0, 0, 0, 75, 77, 3, 6, 3, 0, 76, 75, 1, 0, 0, 0, 76, 77, 1, 0, 0, 0, 77, 79, 1, 0, 0, 0, 78, 80, 3, 8, 4, 0, 79, 78, 1, 0, 0, 0, 79, 80, 1, 0, 0, 0, 80, 82, 1, 0, 0, 0, 81, 83, 3, 10, 5, 0, 82, 81, 1, 0, 0, 0, 82, 83, 1, 0, 0, 0, 83, 85, 1, 0, 0, 0, 84, 86, 3, 12, 6, 0, 85, 84, 1, 0, 0, 0, 85, 86, 1, 0, 0, 0, 86, 88, 1, 0, 0, 0, 87, 89, 3, 14, 7, 0, 88, 87, 1, 0, 0, 0, 88, 89, 1, 0, 0, 0, 89, 3, 1, 0, 0, 0, 90, 91, 7, 0, 0, 0, 91, 5, 1, 0, 0, 0, 92, 93, 5, 21, 0, 0, 93, 7, 1, 0, 0, 0, 94, 95, 5, 126, 0, 0, 95, 9, 1, 0, 0, 0, 96, 97, 5, 101, 0, 0, 97, 11, 1, 0, 0, 0, 98, 99, 5, 45, 0, 0, 99, 13, 1, 0, 0, 0, 100, 101, 5, 52, 0, 0, 101, 15, 1, 0, 0, 0, 102, 103, 5, 105, 0, 0, 103, 17, 1, 0, 0, 0, 104, 108, 5, 1, 0, 0, 105, 106, 3, 26, 13, 0, 106, 107, 5, 2, 0, 0, 107, 109, 1, 0, 0, 0, 108, 105, 1, 0, 0, 0, 108, 109, 1, 0, 0, 0, 109, 110, 1, 0, 0, 0, 110, 111, 3, 26, 13, 0, 111, 112, 5, 3, 0, 0, 112, 19, 1, 0, 0, 0, 113, 115, 3, 22, 11, 0, 114, 113, 1, 0, 0, 0, 114, 115, 1, 0, 0, 0, 115, 117, 1, 0, 0, 0, 116, 118, 3, 24, 12, 0, 117, 116, 1, 0, 0, 0, 117, 118, 1, 0, 0, 0, 118, 21, 1, 0, 0, 0, 119, 120, 5, 91, 0, 0, 120, 23, 1, 0, 0, 0, 121, 122, 5, 85, 0, 0, 122, 25, 1, 0, 0, 0, 123, 124, 7, 1, 0, 0, 124, 27, 1, 0, 0, 0, 125, 128, 3, 30, 15, 0, 126, 128, 3, 32, 16, 0, 127, 125, 1, 0, 0, 0, 127, 126, 1, 0, 0, 0, 127, 128, 1, 0, 0, 0, 128, 130, 1, 0, 0, 0, 129, 131, 3, 34, 17, 0, 130, 129, 1, 0, 0, 0, 130, 131, 1, 0, 0, 0, 131, 133, 1, 0, 0, 0, 132, 134, 3, 36, 18, 0, 133, 132, 1, 0, 0, 0, 133, 134, 1, 0, 0, 0, 134, 146, 1, 0, 0, 0, 135, 137, 3, 34, 17, 0, 136, 135, 1, 0, 0, 0, 136, 137, 1, 0, 0, 0, 137, 140, 1, 0, 0, 0, 138, 141, 3, 30, 15, 0, 139, 141, 3, 32, 16, 0, 140, 138, 1, 0, 0, 0, 140, 139, 1, 0, 0, 0, 140, 141, 1, 0, 0, 0, 141, 143, 1, 0, 0, 0, 142, 144, 3, 36, 18, 0, 143, 142, 1, 0, 0, 0, 143, 144, 1, 0, 0, 0, 144, 146, 1, 0, 0, 0, 145, 127, 1, 0, 0, 0, 145, 136, 1, 0, 0, 0, 146, 29, 1, 0, 0, 0, 147, 148, 5, 5, 0, 0, 148, 149, 3, 50, 25, 0, 149, 31, 1, 0, 0, 0, 150, 151, 5, 6, 0, 0, 151, 152, 3, 50, 25, 0, 152, 33, 1, 0, 0, 0, 153, 154, 5, 7, 0, 0, 154, 155, 3, 50, 25, 0, 155, 35, 1, 0, 0, 0, 156, 157, 5, 8, 0, 0, 157, 162, 7, 2, 0, 0, 158, 159, 5, 1, 0, 0, 159, 160, 3, 38, 19, 0, 160, 161, 5, 3, 0, 0, 161, 163, 1, 0, 0, 0, 162, 158, 1, 0, 0, 0, 162, 163, 1, 0, 0, 0, 163, 37, 1, 0, 0, 0, 164, 166, 8, 3, 0, 0, 165, 164, 1, 0, 0, 0, 166, 167, 1, 0, 0, 0, 167, 165, 1, 0, 0, 0, 167, 168, 1, 0, 0, 0, 168, 39, 1, 0, 0, 0, 169, 171, 3, 42, 21, 0, 170, 169, 1, 0, 0, 0, 170, 171, 1, 0, 0, 0, 171, 173, 1, 0, 0, 0, 172, 174, 3, 46, 23, 0, 173, 172, 1, 0, 0, 0, 173, 174, 1, 0, 0, 0, 174, 176, 1, 0, 0, 0, 175, 177, 3, 48, 24, 0, 176, 175, 1, 0, 0, 0, 176, 177, 1, 0, 0, 0, 177, 41, 1, 0, 0, 0, 178, 183, 3, 44, 22, 0, 179, 180, 5, 9, 0, 0, 180, 182, 3, 44, 22, 0, 181, 179, 1, 0, 0, 0, 182, 185, 1, 0, 0, 0, 183, 181, 1, 0, 0, 0, 183, 184, 1, 0, 0, 0, 184, 43, 1, 0, 0, 0, 185, 183, 1, 0, 0, 0, 186, 188, 3, 52, 26, 0, 187, 189, 3, 34, 17, 0, 188, 187, 1, 0, 0, 0, 188, 189, 1, 0, 0, 0, 189, 45, 1, 0, 0, 0, 190, 191, 5, 1, 0, 0, 191, 192, 3, 36, 18, 0, 192, 193, 5, 3, 0, 0, 193, 47, 1, 0, 0, 0, 194, 195, 5, 10, 0, 0, 195, 200, 3, 50, 25, 0, 196, 197, 5, 11, 0, 0, 197, 199, 3, 50, 25, 0, 198, 196, 1, 0, 0, 0, 199, 202, 1, 0, 0, 0, 200, 198, 1, 0, 0, 0, 200, 201, 1, 0, 0, 0, 201, 49, 1, 0, 0, 0, 202, 200, 1, 0, 0, 0, 203, 208, 3, 52, 26, 0, 204, 205, 5, 12, 0, 0, 205, 207, 3, 52, 26, 0, 206, 204, 1, 0, 0, 0, 207, 210, 1, 0, 0, 0, 208, 206, 1, 0, 0, 0, 208, 209, 1, 0, 0, 0, 209, 51, 1, 0, 0, 0, 210, 208, 1, 0, 0, 0, 211, 213, 8, 4, 0, 0, 212, 211, 1, 0, 0, 0, 213, 214, 1, 0, 0, 0, 214, 212, 1, 0, 0, 0, 214, 215, 1, 0, 0, 0, 215, 53, 1, 0, 0, 0, 31, 55, 58, 61, 64, 67, 73, 76, 79, 82, 85, 88, 108, 114, 117, 127, 130, 133, 136, 140, 143, 145, 162, 167, 170, 173, 176, 183, 188, 200, 208, 214] \ No newline at end of file diff --git a/backend/services/syson-services/src/main/generated/org/eclipse/syson/services/grammars/DirectEdit.tokens b/backend/services/syson-services/src/main/generated/org/eclipse/syson/services/grammars/DirectEdit.tokens index a463de789..bbb96845a 100644 --- a/backend/services/syson-services/src/main/generated/org/eclipse/syson/services/grammars/DirectEdit.tokens +++ b/backend/services/syson-services/src/main/generated/org/eclipse/syson/services/grammars/DirectEdit.tokens @@ -11,14 +11,14 @@ T__9=10 T__10=11 T__11=12 T__12=13 -T__13=14 -WS=15 -Boolean=16 -Integer=17 -Real=18 -DoubleQuotedString=19 -ABOUT=20 -ABSTRACT=21 +WS=14 +Boolean=15 +Integer=16 +Real=17 +DoubleQuotedString=18 +ABOUT=19 +ABSTRACT=20 +ABSTRACT_PREFIX=21 ALIAS=22 ALL=23 AND=24 @@ -42,94 +42,105 @@ DATATYPE=41 DEFAULT=42 DEPENDENCY=43 DERIVED=44 -DIFFERENCES=45 -DISJOINING=46 -DISJOINT=47 -DOC=48 -ELSE=49 -END=50 -EXPR=51 -FALSE=52 -FEATURE=53 -FEATURED=54 -FEATURING=55 -FILTER=56 -FIRST=57 -FLOW=58 -FOR=59 -FROM=60 -FUNCTION=61 -HASTYPE=62 -IF=63 -INTERSECTS=64 -IMPLIES=65 -IMPORT=66 -IN=67 -INPUT=68 -INTERACTION=69 -INV=70 -INVERSE=71 -INVERTING=72 -ISTYPE=73 -LANGUAGE=74 -MEMBER=75 -METACLASS=76 -METADATA=77 -MULTIPLICITY=78 -NAMESPACE=79 -NONUNIQUE=80 -NOT=81 -NULL=82 -OF=83 -OR=84 -ORDERED=85 -OUT=86 -PACKAGE=87 -PORTION=88 -PREDICATE=89 -PRIAVTE=90 -PROTECTED=91 -PUBLIC=92 -READONLY=93 -REDEFINES=94 -REDEFINITION=95 -RFERENCES=96 -REP=97 -RETURN=98 -SPECIALIZTION=99 -SPECIALIZES=100 -STEP=101 -STRCUT=102 -SUBCLASSIFIER=103 -SUBSET=104 -SUBSETS=105 -SUBTYPE=106 -SUCCESSION=107 -THEN=108 -TO=109 -TRUE=110 -TYPE=111 -TYPED=112 -TYPING=113 -UNIONS=114 -XOR=115 -ANY=116 -'ref '=1 -'['=2 -'..'=3 -']'=4 -'*'=5 -':>'=6 -':>>'=7 -':'=8 -'='=9 -'|'=10 -'/'=11 -','=12 -'::'=13 -'::>'=14 -'about'=20 -'abstract'=21 +DERIVED_PREFIX=45 +DIFFERENCES=46 +DISJOINING=47 +DISJOINT=48 +DOC=49 +ELSE=50 +END=51 +END_PREFIX=52 +EXPR=53 +FALSE=54 +FEATURE=55 +FEATURED=56 +FEATURING=57 +FILTER=58 +FIRST=59 +FLOW=60 +FOR=61 +FROM=62 +FUNCTION=63 +HASTYPE=64 +IF=65 +INTERSECTS=66 +IMPLIES=67 +IMPORT=68 +IN=69 +IN_PREFIX=70 +INOUT=71 +INOUT_PREFIX=72 +INTERACTION=73 +INV=74 +INVERSE=75 +INVERTING=76 +ISTYPE=77 +LANGUAGE=78 +MEMBER=79 +METACLASS=80 +METADATA=81 +MULTIPLICITY=82 +NAMESPACE=83 +NONUNIQUE=84 +NONUNIQUE_SUFFIX=85 +NOT=86 +NULL=87 +OF=88 +OR=89 +ORDERED=90 +ORDERED_SUFFIX=91 +OUT=92 +OUT_PREFIX=93 +PACKAGE=94 +PORTION=95 +PREDICATE=96 +PRIAVTE=97 +PROTECTED=98 +PUBLIC=99 +READONLY=100 +READONLY_PREFIX=101 +REDEFINES=102 +REDEFINITION=103 +REF=104 +REF_PREFIX=105 +REFERENCES=106 +REP=107 +RETURN=108 +SPECIALIZTION=109 +SPECIALIZES=110 +STEP=111 +STRCUT=112 +SUBCLASSIFIER=113 +SUBSET=114 +SUBSETS=115 +SUBTYPE=116 +SUCCESSION=117 +THEN=118 +TO=119 +TRUE=120 +TYPE=121 +TYPED=122 +TYPING=123 +UNIONS=124 +VARIATION=125 +VARIATION_PREFIX=126 +XOR=127 +ANY=128 +'['=1 +'..'=2 +']'=3 +'*'=4 +':>'=5 +':>>'=6 +':'=7 +'='=8 +'|'=9 +'/'=10 +','=11 +'::'=12 +'::>'=13 +'about'=19 +'abstract'=20 'alias'=22 'all'=23 'and'=24 @@ -153,74 +164,76 @@ ANY=116 'default'=42 'dependency'=43 'derived'=44 -'differences'=45 -'disjoining'=46 -'disjoint'=47 -'doc'=48 -'else'=49 -'end'=50 -'expr'=51 -'false'=52 -'feature'=53 -'featured'=54 -'featuring'=55 -'filter'=56 -'first'=57 -'flow'=58 -'for'=59 -'from'=60 -'function'=61 -'hastype'=62 -'if'=63 -'intersects'=64 -'implies'=65 -'import'=66 -'in'=67 -'inout'=68 -'interaction'=69 -'inv'=70 -'inverse'=71 -'inverting'=72 -'istype'=73 -'language'=74 -'member'=75 -'metaclass'=76 -'metadata'=77 -'multiplicity'=78 -'namespace'=79 -'nonunique'=80 -'not'=81 -'null'=82 -'of'=83 -'or'=84 -'ordered'=85 -'out'=86 -'package'=87 -'portion'=88 -'predicate'=89 -'private'=90 -'protected'=91 -'public'=92 -'readonly'=93 -'redefines'=94 -'redefinition'=95 -'references'=96 -'rep'=97 -'return'=98 -'specialization'=99 -'specializes'=100 -'step'=101 -'struct'=102 -'subclassifier'=103 -'subset'=104 -'subsets'=105 -'subtype'=106 -'succession'=107 -'then'=108 -'to'=109 -'true'=110 -'type'=111 -'typed'=112 -'typing'=113 -'unions'=114 -'xor'=115 +'differences'=46 +'disjoining'=47 +'disjoint'=48 +'doc'=49 +'else'=50 +'end'=51 +'expr'=53 +'false'=54 +'feature'=55 +'featured'=56 +'featuring'=57 +'filter'=58 +'first'=59 +'flow'=60 +'for'=61 +'from'=62 +'function'=63 +'hastype'=64 +'if'=65 +'intersects'=66 +'implies'=67 +'import'=68 +'in'=69 +'inout'=71 +'interaction'=73 +'inv'=74 +'inverse'=75 +'inverting'=76 +'istype'=77 +'language'=78 +'member'=79 +'metaclass'=80 +'metadata'=81 +'multiplicity'=82 +'namespace'=83 +'nonunique'=84 +'not'=86 +'null'=87 +'of'=88 +'or'=89 +'ordered'=90 +'out'=92 +'package'=94 +'portion'=95 +'predicate'=96 +'private'=97 +'protected'=98 +'public'=99 +'readonly'=100 +'redefines'=102 +'redefinition'=103 +'ref'=104 +'references'=106 +'rep'=107 +'return'=108 +'specialization'=109 +'specializes'=110 +'step'=111 +'struct'=112 +'subclassifier'=113 +'subset'=114 +'subsets'=115 +'subtype'=116 +'succession'=117 +'then'=118 +'to'=119 +'true'=120 +'type'=121 +'typed'=122 +'typing'=123 +'unions'=124 +'variation'=125 +'xor'=127 diff --git a/backend/services/syson-services/src/main/generated/org/eclipse/syson/services/grammars/DirectEditBaseListener.java b/backend/services/syson-services/src/main/generated/org/eclipse/syson/services/grammars/DirectEditBaseListener.java index a7e6395c4..835d0c6a1 100644 --- a/backend/services/syson-services/src/main/generated/org/eclipse/syson/services/grammars/DirectEditBaseListener.java +++ b/backend/services/syson-services/src/main/generated/org/eclipse/syson/services/grammars/DirectEditBaseListener.java @@ -37,6 +37,90 @@ public class DirectEditBaseListener implements DirectEditListener { *

The default implementation does nothing.

*/ @Override public void exitExpression(DirectEditParser.ExpressionContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterPrefixExpression(DirectEditParser.PrefixExpressionContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitPrefixExpression(DirectEditParser.PrefixExpressionContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterDirectionPrefixExpression(DirectEditParser.DirectionPrefixExpressionContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitDirectionPrefixExpression(DirectEditParser.DirectionPrefixExpressionContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterAbstractPrefixExpression(DirectEditParser.AbstractPrefixExpressionContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitAbstractPrefixExpression(DirectEditParser.AbstractPrefixExpressionContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterVariationPrefixExpression(DirectEditParser.VariationPrefixExpressionContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitVariationPrefixExpression(DirectEditParser.VariationPrefixExpressionContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterReadonlyPrefixExpression(DirectEditParser.ReadonlyPrefixExpressionContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitReadonlyPrefixExpression(DirectEditParser.ReadonlyPrefixExpressionContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterDerivedPrefixExpression(DirectEditParser.DerivedPrefixExpressionContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitDerivedPrefixExpression(DirectEditParser.DerivedPrefixExpressionContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterEndPrefixExpression(DirectEditParser.EndPrefixExpressionContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitEndPrefixExpression(DirectEditParser.EndPrefixExpressionContext ctx) { } /** * {@inheritDoc} * @@ -61,6 +145,42 @@ public class DirectEditBaseListener implements DirectEditListener { *

The default implementation does nothing.

*/ @Override public void exitMultiplicityExpression(DirectEditParser.MultiplicityExpressionContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterMultiplicityPropExpression(DirectEditParser.MultiplicityPropExpressionContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitMultiplicityPropExpression(DirectEditParser.MultiplicityPropExpressionContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterOrderedMultiplicityExpression(DirectEditParser.OrderedMultiplicityExpressionContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitOrderedMultiplicityExpression(DirectEditParser.OrderedMultiplicityExpressionContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterNonuniqueMultiplicityExpression(DirectEditParser.NonuniqueMultiplicityExpressionContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitNonuniqueMultiplicityExpression(DirectEditParser.NonuniqueMultiplicityExpressionContext ctx) { } /** * {@inheritDoc} * diff --git a/backend/services/syson-services/src/main/generated/org/eclipse/syson/services/grammars/DirectEditLexer.interp b/backend/services/syson-services/src/main/generated/org/eclipse/syson/services/grammars/DirectEditLexer.interp index 1e4a8241c..c44d7b982 100644 --- a/backend/services/syson-services/src/main/generated/org/eclipse/syson/services/grammars/DirectEditLexer.interp +++ b/backend/services/syson-services/src/main/generated/org/eclipse/syson/services/grammars/DirectEditLexer.interp @@ -1,6 +1,5 @@ token literal names: null -'ref ' '[' '..' ']' @@ -21,6 +20,7 @@ null null 'about' 'abstract' +null 'alias' 'all' 'and' @@ -44,12 +44,14 @@ null 'default' 'dependency' 'derived' +null 'differences' 'disjoining' 'disjoint' 'doc' 'else' 'end' +null 'expr' 'false' 'feature' @@ -67,7 +69,9 @@ null 'implies' 'import' 'in' +null 'inout' +null 'interaction' 'inv' 'inverse' @@ -80,12 +84,15 @@ null 'multiplicity' 'namespace' 'nonunique' +null 'not' 'null' 'of' 'or' 'ordered' +null 'out' +null 'package' 'portion' 'predicate' @@ -93,8 +100,11 @@ null 'protected' 'public' 'readonly' +null 'redefines' 'redefinition' +'ref' +null 'references' 'rep' 'return' @@ -114,6 +124,8 @@ null 'typed' 'typing' 'unions' +'variation' +null 'xor' null @@ -132,7 +144,6 @@ null null null null -null WS Boolean Integer @@ -140,6 +151,7 @@ Real DoubleQuotedString ABOUT ABSTRACT +ABSTRACT_PREFIX ALIAS ALL AND @@ -163,12 +175,14 @@ DATATYPE DEFAULT DEPENDENCY DERIVED +DERIVED_PREFIX DIFFERENCES DISJOINING DISJOINT DOC ELSE END +END_PREFIX EXPR FALSE FEATURE @@ -186,7 +200,9 @@ INTERSECTS IMPLIES IMPORT IN -INPUT +IN_PREFIX +INOUT +INOUT_PREFIX INTERACTION INV INVERSE @@ -199,12 +215,15 @@ METADATA MULTIPLICITY NAMESPACE NONUNIQUE +NONUNIQUE_SUFFIX NOT NULL OF OR ORDERED +ORDERED_SUFFIX OUT +OUT_PREFIX PACKAGE PORTION PREDICATE @@ -212,9 +231,12 @@ PRIAVTE PROTECTED PUBLIC READONLY +READONLY_PREFIX REDEFINES REDEFINITION -RFERENCES +REF +REF_PREFIX +REFERENCES REP RETURN SPECIALIZTION @@ -233,6 +255,8 @@ TYPE TYPED TYPING UNIONS +VARIATION +VARIATION_PREFIX XOR ANY @@ -250,7 +274,6 @@ T__9 T__10 T__11 T__12 -T__13 WS Boolean Integer @@ -258,6 +281,7 @@ Real DoubleQuotedString ABOUT ABSTRACT +ABSTRACT_PREFIX ALIAS ALL AND @@ -281,12 +305,14 @@ DATATYPE DEFAULT DEPENDENCY DERIVED +DERIVED_PREFIX DIFFERENCES DISJOINING DISJOINT DOC ELSE END +END_PREFIX EXPR FALSE FEATURE @@ -304,7 +330,9 @@ INTERSECTS IMPLIES IMPORT IN -INPUT +IN_PREFIX +INOUT +INOUT_PREFIX INTERACTION INV INVERSE @@ -317,12 +345,15 @@ METADATA MULTIPLICITY NAMESPACE NONUNIQUE +NONUNIQUE_SUFFIX NOT NULL OF OR ORDERED +ORDERED_SUFFIX OUT +OUT_PREFIX PACKAGE PORTION PREDICATE @@ -330,9 +361,12 @@ PRIAVTE PROTECTED PUBLIC READONLY +READONLY_PREFIX REDEFINES REDEFINITION -RFERENCES +REF +REF_PREFIX +REFERENCES REP RETURN SPECIALIZTION @@ -351,6 +385,8 @@ TYPE TYPED TYPING UNIONS +VARIATION +VARIATION_PREFIX XOR ANY @@ -362,4 +398,4 @@ mode names: DEFAULT_MODE atn: -[4, 0, 116, 1037, 6, -1, 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, 2, 41, 7, 41, 2, 42, 7, 42, 2, 43, 7, 43, 2, 44, 7, 44, 2, 45, 7, 45, 2, 46, 7, 46, 2, 47, 7, 47, 2, 48, 7, 48, 2, 49, 7, 49, 2, 50, 7, 50, 2, 51, 7, 51, 2, 52, 7, 52, 2, 53, 7, 53, 2, 54, 7, 54, 2, 55, 7, 55, 2, 56, 7, 56, 2, 57, 7, 57, 2, 58, 7, 58, 2, 59, 7, 59, 2, 60, 7, 60, 2, 61, 7, 61, 2, 62, 7, 62, 2, 63, 7, 63, 2, 64, 7, 64, 2, 65, 7, 65, 2, 66, 7, 66, 2, 67, 7, 67, 2, 68, 7, 68, 2, 69, 7, 69, 2, 70, 7, 70, 2, 71, 7, 71, 2, 72, 7, 72, 2, 73, 7, 73, 2, 74, 7, 74, 2, 75, 7, 75, 2, 76, 7, 76, 2, 77, 7, 77, 2, 78, 7, 78, 2, 79, 7, 79, 2, 80, 7, 80, 2, 81, 7, 81, 2, 82, 7, 82, 2, 83, 7, 83, 2, 84, 7, 84, 2, 85, 7, 85, 2, 86, 7, 86, 2, 87, 7, 87, 2, 88, 7, 88, 2, 89, 7, 89, 2, 90, 7, 90, 2, 91, 7, 91, 2, 92, 7, 92, 2, 93, 7, 93, 2, 94, 7, 94, 2, 95, 7, 95, 2, 96, 7, 96, 2, 97, 7, 97, 2, 98, 7, 98, 2, 99, 7, 99, 2, 100, 7, 100, 2, 101, 7, 101, 2, 102, 7, 102, 2, 103, 7, 103, 2, 104, 7, 104, 2, 105, 7, 105, 2, 106, 7, 106, 2, 107, 7, 107, 2, 108, 7, 108, 2, 109, 7, 109, 2, 110, 7, 110, 2, 111, 7, 111, 2, 112, 7, 112, 2, 113, 7, 113, 2, 114, 7, 114, 2, 115, 7, 115, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 1, 1, 1, 1, 2, 1, 2, 1, 2, 1, 3, 1, 3, 1, 4, 1, 4, 1, 5, 1, 5, 1, 5, 1, 6, 1, 6, 1, 6, 1, 6, 1, 7, 1, 7, 1, 8, 1, 8, 1, 9, 1, 9, 1, 10, 1, 10, 1, 11, 1, 11, 1, 12, 1, 12, 1, 12, 1, 13, 1, 13, 1, 13, 1, 13, 1, 14, 4, 14, 273, 8, 14, 11, 14, 12, 14, 274, 1, 14, 1, 14, 1, 15, 1, 15, 3, 15, 281, 8, 15, 1, 16, 4, 16, 284, 8, 16, 11, 16, 12, 16, 285, 1, 17, 4, 17, 289, 8, 17, 11, 17, 12, 17, 290, 1, 17, 1, 17, 4, 17, 295, 8, 17, 11, 17, 12, 17, 296, 1, 18, 1, 18, 1, 18, 1, 18, 5, 18, 303, 8, 18, 10, 18, 12, 18, 306, 9, 18, 1, 18, 1, 18, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 21, 1, 21, 1, 21, 1, 21, 1, 21, 1, 21, 1, 22, 1, 22, 1, 22, 1, 22, 1, 23, 1, 23, 1, 23, 1, 23, 1, 24, 1, 24, 1, 24, 1, 25, 1, 25, 1, 25, 1, 25, 1, 25, 1, 25, 1, 25, 1, 26, 1, 26, 1, 26, 1, 26, 1, 26, 1, 26, 1, 27, 1, 27, 1, 27, 1, 27, 1, 27, 1, 27, 1, 27, 1, 27, 1, 27, 1, 28, 1, 28, 1, 28, 1, 28, 1, 28, 1, 28, 1, 28, 1, 28, 1, 29, 1, 29, 1, 29, 1, 29, 1, 29, 1, 30, 1, 30, 1, 30, 1, 31, 1, 31, 1, 31, 1, 31, 1, 31, 1, 31, 1, 31, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 33, 1, 33, 1, 33, 1, 33, 1, 33, 1, 33, 1, 33, 1, 33, 1, 33, 1, 33, 1, 33, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 1, 35, 1, 35, 1, 35, 1, 35, 1, 35, 1, 35, 1, 35, 1, 35, 1, 35, 1, 35, 1, 36, 1, 36, 1, 36, 1, 36, 1, 36, 1, 36, 1, 36, 1, 36, 1, 36, 1, 36, 1, 37, 1, 37, 1, 37, 1, 37, 1, 37, 1, 37, 1, 37, 1, 37, 1, 37, 1, 37, 1, 37, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 39, 1, 39, 1, 39, 1, 39, 1, 39, 1, 39, 1, 39, 1, 39, 1, 39, 1, 39, 1, 40, 1, 40, 1, 40, 1, 40, 1, 40, 1, 40, 1, 40, 1, 40, 1, 40, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 42, 1, 42, 1, 42, 1, 42, 1, 42, 1, 42, 1, 42, 1, 42, 1, 42, 1, 42, 1, 42, 1, 43, 1, 43, 1, 43, 1, 43, 1, 43, 1, 43, 1, 43, 1, 43, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 46, 1, 46, 1, 46, 1, 46, 1, 46, 1, 46, 1, 46, 1, 46, 1, 46, 1, 47, 1, 47, 1, 47, 1, 47, 1, 48, 1, 48, 1, 48, 1, 48, 1, 48, 1, 49, 1, 49, 1, 49, 1, 49, 1, 50, 1, 50, 1, 50, 1, 50, 1, 50, 1, 51, 1, 51, 1, 51, 1, 51, 1, 51, 1, 51, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 53, 1, 53, 1, 53, 1, 53, 1, 53, 1, 53, 1, 53, 1, 53, 1, 53, 1, 54, 1, 54, 1, 54, 1, 54, 1, 54, 1, 54, 1, 54, 1, 54, 1, 54, 1, 54, 1, 55, 1, 55, 1, 55, 1, 55, 1, 55, 1, 55, 1, 55, 1, 56, 1, 56, 1, 56, 1, 56, 1, 56, 1, 56, 1, 57, 1, 57, 1, 57, 1, 57, 1, 57, 1, 58, 1, 58, 1, 58, 1, 58, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 61, 1, 61, 1, 61, 1, 61, 1, 61, 1, 61, 1, 61, 1, 61, 1, 62, 1, 62, 1, 62, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 64, 1, 64, 1, 64, 1, 64, 1, 64, 1, 64, 1, 64, 1, 64, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 1, 66, 1, 66, 1, 66, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 68, 1, 68, 1, 68, 1, 68, 1, 68, 1, 68, 1, 68, 1, 68, 1, 68, 1, 68, 1, 68, 1, 68, 1, 69, 1, 69, 1, 69, 1, 69, 1, 70, 1, 70, 1, 70, 1, 70, 1, 70, 1, 70, 1, 70, 1, 70, 1, 71, 1, 71, 1, 71, 1, 71, 1, 71, 1, 71, 1, 71, 1, 71, 1, 71, 1, 71, 1, 72, 1, 72, 1, 72, 1, 72, 1, 72, 1, 72, 1, 72, 1, 73, 1, 73, 1, 73, 1, 73, 1, 73, 1, 73, 1, 73, 1, 73, 1, 73, 1, 74, 1, 74, 1, 74, 1, 74, 1, 74, 1, 74, 1, 74, 1, 75, 1, 75, 1, 75, 1, 75, 1, 75, 1, 75, 1, 75, 1, 75, 1, 75, 1, 75, 1, 76, 1, 76, 1, 76, 1, 76, 1, 76, 1, 76, 1, 76, 1, 76, 1, 76, 1, 77, 1, 77, 1, 77, 1, 77, 1, 77, 1, 77, 1, 77, 1, 77, 1, 77, 1, 77, 1, 77, 1, 77, 1, 77, 1, 78, 1, 78, 1, 78, 1, 78, 1, 78, 1, 78, 1, 78, 1, 78, 1, 78, 1, 78, 1, 79, 1, 79, 1, 79, 1, 79, 1, 79, 1, 79, 1, 79, 1, 79, 1, 79, 1, 79, 1, 80, 1, 80, 1, 80, 1, 80, 1, 81, 1, 81, 1, 81, 1, 81, 1, 81, 1, 82, 1, 82, 1, 82, 1, 83, 1, 83, 1, 83, 1, 84, 1, 84, 1, 84, 1, 84, 1, 84, 1, 84, 1, 84, 1, 84, 1, 85, 1, 85, 1, 85, 1, 85, 1, 86, 1, 86, 1, 86, 1, 86, 1, 86, 1, 86, 1, 86, 1, 86, 1, 87, 1, 87, 1, 87, 1, 87, 1, 87, 1, 87, 1, 87, 1, 87, 1, 88, 1, 88, 1, 88, 1, 88, 1, 88, 1, 88, 1, 88, 1, 88, 1, 88, 1, 88, 1, 89, 1, 89, 1, 89, 1, 89, 1, 89, 1, 89, 1, 89, 1, 89, 1, 90, 1, 90, 1, 90, 1, 90, 1, 90, 1, 90, 1, 90, 1, 90, 1, 90, 1, 90, 1, 91, 1, 91, 1, 91, 1, 91, 1, 91, 1, 91, 1, 91, 1, 92, 1, 92, 1, 92, 1, 92, 1, 92, 1, 92, 1, 92, 1, 92, 1, 92, 1, 93, 1, 93, 1, 93, 1, 93, 1, 93, 1, 93, 1, 93, 1, 93, 1, 93, 1, 93, 1, 94, 1, 94, 1, 94, 1, 94, 1, 94, 1, 94, 1, 94, 1, 94, 1, 94, 1, 94, 1, 94, 1, 94, 1, 94, 1, 95, 1, 95, 1, 95, 1, 95, 1, 95, 1, 95, 1, 95, 1, 95, 1, 95, 1, 95, 1, 95, 1, 96, 1, 96, 1, 96, 1, 96, 1, 97, 1, 97, 1, 97, 1, 97, 1, 97, 1, 97, 1, 97, 1, 98, 1, 98, 1, 98, 1, 98, 1, 98, 1, 98, 1, 98, 1, 98, 1, 98, 1, 98, 1, 98, 1, 98, 1, 98, 1, 98, 1, 98, 1, 99, 1, 99, 1, 99, 1, 99, 1, 99, 1, 99, 1, 99, 1, 99, 1, 99, 1, 99, 1, 99, 1, 99, 1, 100, 1, 100, 1, 100, 1, 100, 1, 100, 1, 101, 1, 101, 1, 101, 1, 101, 1, 101, 1, 101, 1, 101, 1, 102, 1, 102, 1, 102, 1, 102, 1, 102, 1, 102, 1, 102, 1, 102, 1, 102, 1, 102, 1, 102, 1, 102, 1, 102, 1, 102, 1, 103, 1, 103, 1, 103, 1, 103, 1, 103, 1, 103, 1, 103, 1, 104, 1, 104, 1, 104, 1, 104, 1, 104, 1, 104, 1, 104, 1, 104, 1, 105, 1, 105, 1, 105, 1, 105, 1, 105, 1, 105, 1, 105, 1, 105, 1, 106, 1, 106, 1, 106, 1, 106, 1, 106, 1, 106, 1, 106, 1, 106, 1, 106, 1, 106, 1, 106, 1, 107, 1, 107, 1, 107, 1, 107, 1, 107, 1, 108, 1, 108, 1, 108, 1, 109, 1, 109, 1, 109, 1, 109, 1, 109, 1, 110, 1, 110, 1, 110, 1, 110, 1, 110, 1, 111, 1, 111, 1, 111, 1, 111, 1, 111, 1, 111, 1, 112, 1, 112, 1, 112, 1, 112, 1, 112, 1, 112, 1, 112, 1, 113, 1, 113, 1, 113, 1, 113, 1, 113, 1, 113, 1, 113, 1, 114, 1, 114, 1, 114, 1, 114, 1, 115, 1, 115, 0, 0, 116, 1, 1, 3, 2, 5, 3, 7, 4, 9, 5, 11, 6, 13, 7, 15, 8, 17, 9, 19, 10, 21, 11, 23, 12, 25, 13, 27, 14, 29, 15, 31, 16, 33, 17, 35, 18, 37, 19, 39, 20, 41, 21, 43, 22, 45, 23, 47, 24, 49, 25, 51, 26, 53, 27, 55, 28, 57, 29, 59, 30, 61, 31, 63, 32, 65, 33, 67, 34, 69, 35, 71, 36, 73, 37, 75, 38, 77, 39, 79, 40, 81, 41, 83, 42, 85, 43, 87, 44, 89, 45, 91, 46, 93, 47, 95, 48, 97, 49, 99, 50, 101, 51, 103, 52, 105, 53, 107, 54, 109, 55, 111, 56, 113, 57, 115, 58, 117, 59, 119, 60, 121, 61, 123, 62, 125, 63, 127, 64, 129, 65, 131, 66, 133, 67, 135, 68, 137, 69, 139, 70, 141, 71, 143, 72, 145, 73, 147, 74, 149, 75, 151, 76, 153, 77, 155, 78, 157, 79, 159, 80, 161, 81, 163, 82, 165, 83, 167, 84, 169, 85, 171, 86, 173, 87, 175, 88, 177, 89, 179, 90, 181, 91, 183, 92, 185, 93, 187, 94, 189, 95, 191, 96, 193, 97, 195, 98, 197, 99, 199, 100, 201, 101, 203, 102, 205, 103, 207, 104, 209, 105, 211, 106, 213, 107, 215, 108, 217, 109, 219, 110, 221, 111, 223, 112, 225, 113, 227, 114, 229, 115, 231, 116, 1, 0, 3, 3, 0, 9, 10, 12, 13, 32, 32, 1, 0, 48, 57, 3, 0, 10, 10, 13, 13, 34, 34, 1043, 0, 1, 1, 0, 0, 0, 0, 3, 1, 0, 0, 0, 0, 5, 1, 0, 0, 0, 0, 7, 1, 0, 0, 0, 0, 9, 1, 0, 0, 0, 0, 11, 1, 0, 0, 0, 0, 13, 1, 0, 0, 0, 0, 15, 1, 0, 0, 0, 0, 17, 1, 0, 0, 0, 0, 19, 1, 0, 0, 0, 0, 21, 1, 0, 0, 0, 0, 23, 1, 0, 0, 0, 0, 25, 1, 0, 0, 0, 0, 27, 1, 0, 0, 0, 0, 29, 1, 0, 0, 0, 0, 31, 1, 0, 0, 0, 0, 33, 1, 0, 0, 0, 0, 35, 1, 0, 0, 0, 0, 37, 1, 0, 0, 0, 0, 39, 1, 0, 0, 0, 0, 41, 1, 0, 0, 0, 0, 43, 1, 0, 0, 0, 0, 45, 1, 0, 0, 0, 0, 47, 1, 0, 0, 0, 0, 49, 1, 0, 0, 0, 0, 51, 1, 0, 0, 0, 0, 53, 1, 0, 0, 0, 0, 55, 1, 0, 0, 0, 0, 57, 1, 0, 0, 0, 0, 59, 1, 0, 0, 0, 0, 61, 1, 0, 0, 0, 0, 63, 1, 0, 0, 0, 0, 65, 1, 0, 0, 0, 0, 67, 1, 0, 0, 0, 0, 69, 1, 0, 0, 0, 0, 71, 1, 0, 0, 0, 0, 73, 1, 0, 0, 0, 0, 75, 1, 0, 0, 0, 0, 77, 1, 0, 0, 0, 0, 79, 1, 0, 0, 0, 0, 81, 1, 0, 0, 0, 0, 83, 1, 0, 0, 0, 0, 85, 1, 0, 0, 0, 0, 87, 1, 0, 0, 0, 0, 89, 1, 0, 0, 0, 0, 91, 1, 0, 0, 0, 0, 93, 1, 0, 0, 0, 0, 95, 1, 0, 0, 0, 0, 97, 1, 0, 0, 0, 0, 99, 1, 0, 0, 0, 0, 101, 1, 0, 0, 0, 0, 103, 1, 0, 0, 0, 0, 105, 1, 0, 0, 0, 0, 107, 1, 0, 0, 0, 0, 109, 1, 0, 0, 0, 0, 111, 1, 0, 0, 0, 0, 113, 1, 0, 0, 0, 0, 115, 1, 0, 0, 0, 0, 117, 1, 0, 0, 0, 0, 119, 1, 0, 0, 0, 0, 121, 1, 0, 0, 0, 0, 123, 1, 0, 0, 0, 0, 125, 1, 0, 0, 0, 0, 127, 1, 0, 0, 0, 0, 129, 1, 0, 0, 0, 0, 131, 1, 0, 0, 0, 0, 133, 1, 0, 0, 0, 0, 135, 1, 0, 0, 0, 0, 137, 1, 0, 0, 0, 0, 139, 1, 0, 0, 0, 0, 141, 1, 0, 0, 0, 0, 143, 1, 0, 0, 0, 0, 145, 1, 0, 0, 0, 0, 147, 1, 0, 0, 0, 0, 149, 1, 0, 0, 0, 0, 151, 1, 0, 0, 0, 0, 153, 1, 0, 0, 0, 0, 155, 1, 0, 0, 0, 0, 157, 1, 0, 0, 0, 0, 159, 1, 0, 0, 0, 0, 161, 1, 0, 0, 0, 0, 163, 1, 0, 0, 0, 0, 165, 1, 0, 0, 0, 0, 167, 1, 0, 0, 0, 0, 169, 1, 0, 0, 0, 0, 171, 1, 0, 0, 0, 0, 173, 1, 0, 0, 0, 0, 175, 1, 0, 0, 0, 0, 177, 1, 0, 0, 0, 0, 179, 1, 0, 0, 0, 0, 181, 1, 0, 0, 0, 0, 183, 1, 0, 0, 0, 0, 185, 1, 0, 0, 0, 0, 187, 1, 0, 0, 0, 0, 189, 1, 0, 0, 0, 0, 191, 1, 0, 0, 0, 0, 193, 1, 0, 0, 0, 0, 195, 1, 0, 0, 0, 0, 197, 1, 0, 0, 0, 0, 199, 1, 0, 0, 0, 0, 201, 1, 0, 0, 0, 0, 203, 1, 0, 0, 0, 0, 205, 1, 0, 0, 0, 0, 207, 1, 0, 0, 0, 0, 209, 1, 0, 0, 0, 0, 211, 1, 0, 0, 0, 0, 213, 1, 0, 0, 0, 0, 215, 1, 0, 0, 0, 0, 217, 1, 0, 0, 0, 0, 219, 1, 0, 0, 0, 0, 221, 1, 0, 0, 0, 0, 223, 1, 0, 0, 0, 0, 225, 1, 0, 0, 0, 0, 227, 1, 0, 0, 0, 0, 229, 1, 0, 0, 0, 0, 231, 1, 0, 0, 0, 1, 233, 1, 0, 0, 0, 3, 238, 1, 0, 0, 0, 5, 240, 1, 0, 0, 0, 7, 243, 1, 0, 0, 0, 9, 245, 1, 0, 0, 0, 11, 247, 1, 0, 0, 0, 13, 250, 1, 0, 0, 0, 15, 254, 1, 0, 0, 0, 17, 256, 1, 0, 0, 0, 19, 258, 1, 0, 0, 0, 21, 260, 1, 0, 0, 0, 23, 262, 1, 0, 0, 0, 25, 264, 1, 0, 0, 0, 27, 267, 1, 0, 0, 0, 29, 272, 1, 0, 0, 0, 31, 280, 1, 0, 0, 0, 33, 283, 1, 0, 0, 0, 35, 288, 1, 0, 0, 0, 37, 298, 1, 0, 0, 0, 39, 309, 1, 0, 0, 0, 41, 315, 1, 0, 0, 0, 43, 324, 1, 0, 0, 0, 45, 330, 1, 0, 0, 0, 47, 334, 1, 0, 0, 0, 49, 338, 1, 0, 0, 0, 51, 341, 1, 0, 0, 0, 53, 348, 1, 0, 0, 0, 55, 354, 1, 0, 0, 0, 57, 363, 1, 0, 0, 0, 59, 371, 1, 0, 0, 0, 61, 376, 1, 0, 0, 0, 63, 379, 1, 0, 0, 0, 65, 386, 1, 0, 0, 0, 67, 392, 1, 0, 0, 0, 69, 403, 1, 0, 0, 0, 71, 411, 1, 0, 0, 0, 73, 421, 1, 0, 0, 0, 75, 431, 1, 0, 0, 0, 77, 442, 1, 0, 0, 0, 79, 454, 1, 0, 0, 0, 81, 464, 1, 0, 0, 0, 83, 473, 1, 0, 0, 0, 85, 481, 1, 0, 0, 0, 87, 492, 1, 0, 0, 0, 89, 500, 1, 0, 0, 0, 91, 512, 1, 0, 0, 0, 93, 523, 1, 0, 0, 0, 95, 532, 1, 0, 0, 0, 97, 536, 1, 0, 0, 0, 99, 541, 1, 0, 0, 0, 101, 545, 1, 0, 0, 0, 103, 550, 1, 0, 0, 0, 105, 556, 1, 0, 0, 0, 107, 564, 1, 0, 0, 0, 109, 573, 1, 0, 0, 0, 111, 583, 1, 0, 0, 0, 113, 590, 1, 0, 0, 0, 115, 596, 1, 0, 0, 0, 117, 601, 1, 0, 0, 0, 119, 605, 1, 0, 0, 0, 121, 610, 1, 0, 0, 0, 123, 619, 1, 0, 0, 0, 125, 627, 1, 0, 0, 0, 127, 630, 1, 0, 0, 0, 129, 641, 1, 0, 0, 0, 131, 649, 1, 0, 0, 0, 133, 656, 1, 0, 0, 0, 135, 659, 1, 0, 0, 0, 137, 665, 1, 0, 0, 0, 139, 677, 1, 0, 0, 0, 141, 681, 1, 0, 0, 0, 143, 689, 1, 0, 0, 0, 145, 699, 1, 0, 0, 0, 147, 706, 1, 0, 0, 0, 149, 715, 1, 0, 0, 0, 151, 722, 1, 0, 0, 0, 153, 732, 1, 0, 0, 0, 155, 741, 1, 0, 0, 0, 157, 754, 1, 0, 0, 0, 159, 764, 1, 0, 0, 0, 161, 774, 1, 0, 0, 0, 163, 778, 1, 0, 0, 0, 165, 783, 1, 0, 0, 0, 167, 786, 1, 0, 0, 0, 169, 789, 1, 0, 0, 0, 171, 797, 1, 0, 0, 0, 173, 801, 1, 0, 0, 0, 175, 809, 1, 0, 0, 0, 177, 817, 1, 0, 0, 0, 179, 827, 1, 0, 0, 0, 181, 835, 1, 0, 0, 0, 183, 845, 1, 0, 0, 0, 185, 852, 1, 0, 0, 0, 187, 861, 1, 0, 0, 0, 189, 871, 1, 0, 0, 0, 191, 884, 1, 0, 0, 0, 193, 895, 1, 0, 0, 0, 195, 899, 1, 0, 0, 0, 197, 906, 1, 0, 0, 0, 199, 921, 1, 0, 0, 0, 201, 933, 1, 0, 0, 0, 203, 938, 1, 0, 0, 0, 205, 945, 1, 0, 0, 0, 207, 959, 1, 0, 0, 0, 209, 966, 1, 0, 0, 0, 211, 974, 1, 0, 0, 0, 213, 982, 1, 0, 0, 0, 215, 993, 1, 0, 0, 0, 217, 998, 1, 0, 0, 0, 219, 1001, 1, 0, 0, 0, 221, 1006, 1, 0, 0, 0, 223, 1011, 1, 0, 0, 0, 225, 1017, 1, 0, 0, 0, 227, 1024, 1, 0, 0, 0, 229, 1031, 1, 0, 0, 0, 231, 1035, 1, 0, 0, 0, 233, 234, 5, 114, 0, 0, 234, 235, 5, 101, 0, 0, 235, 236, 5, 102, 0, 0, 236, 237, 5, 32, 0, 0, 237, 2, 1, 0, 0, 0, 238, 239, 5, 91, 0, 0, 239, 4, 1, 0, 0, 0, 240, 241, 5, 46, 0, 0, 241, 242, 5, 46, 0, 0, 242, 6, 1, 0, 0, 0, 243, 244, 5, 93, 0, 0, 244, 8, 1, 0, 0, 0, 245, 246, 5, 42, 0, 0, 246, 10, 1, 0, 0, 0, 247, 248, 5, 58, 0, 0, 248, 249, 5, 62, 0, 0, 249, 12, 1, 0, 0, 0, 250, 251, 5, 58, 0, 0, 251, 252, 5, 62, 0, 0, 252, 253, 5, 62, 0, 0, 253, 14, 1, 0, 0, 0, 254, 255, 5, 58, 0, 0, 255, 16, 1, 0, 0, 0, 256, 257, 5, 61, 0, 0, 257, 18, 1, 0, 0, 0, 258, 259, 5, 124, 0, 0, 259, 20, 1, 0, 0, 0, 260, 261, 5, 47, 0, 0, 261, 22, 1, 0, 0, 0, 262, 263, 5, 44, 0, 0, 263, 24, 1, 0, 0, 0, 264, 265, 5, 58, 0, 0, 265, 266, 5, 58, 0, 0, 266, 26, 1, 0, 0, 0, 267, 268, 5, 58, 0, 0, 268, 269, 5, 58, 0, 0, 269, 270, 5, 62, 0, 0, 270, 28, 1, 0, 0, 0, 271, 273, 7, 0, 0, 0, 272, 271, 1, 0, 0, 0, 273, 274, 1, 0, 0, 0, 274, 272, 1, 0, 0, 0, 274, 275, 1, 0, 0, 0, 275, 276, 1, 0, 0, 0, 276, 277, 6, 14, 0, 0, 277, 30, 1, 0, 0, 0, 278, 281, 3, 219, 109, 0, 279, 281, 3, 103, 51, 0, 280, 278, 1, 0, 0, 0, 280, 279, 1, 0, 0, 0, 281, 32, 1, 0, 0, 0, 282, 284, 7, 1, 0, 0, 283, 282, 1, 0, 0, 0, 284, 285, 1, 0, 0, 0, 285, 283, 1, 0, 0, 0, 285, 286, 1, 0, 0, 0, 286, 34, 1, 0, 0, 0, 287, 289, 7, 1, 0, 0, 288, 287, 1, 0, 0, 0, 289, 290, 1, 0, 0, 0, 290, 288, 1, 0, 0, 0, 290, 291, 1, 0, 0, 0, 291, 292, 1, 0, 0, 0, 292, 294, 5, 46, 0, 0, 293, 295, 7, 1, 0, 0, 294, 293, 1, 0, 0, 0, 295, 296, 1, 0, 0, 0, 296, 294, 1, 0, 0, 0, 296, 297, 1, 0, 0, 0, 297, 36, 1, 0, 0, 0, 298, 304, 5, 34, 0, 0, 299, 303, 8, 2, 0, 0, 300, 301, 5, 34, 0, 0, 301, 303, 5, 34, 0, 0, 302, 299, 1, 0, 0, 0, 302, 300, 1, 0, 0, 0, 303, 306, 1, 0, 0, 0, 304, 302, 1, 0, 0, 0, 304, 305, 1, 0, 0, 0, 305, 307, 1, 0, 0, 0, 306, 304, 1, 0, 0, 0, 307, 308, 5, 34, 0, 0, 308, 38, 1, 0, 0, 0, 309, 310, 5, 97, 0, 0, 310, 311, 5, 98, 0, 0, 311, 312, 5, 111, 0, 0, 312, 313, 5, 117, 0, 0, 313, 314, 5, 116, 0, 0, 314, 40, 1, 0, 0, 0, 315, 316, 5, 97, 0, 0, 316, 317, 5, 98, 0, 0, 317, 318, 5, 115, 0, 0, 318, 319, 5, 116, 0, 0, 319, 320, 5, 114, 0, 0, 320, 321, 5, 97, 0, 0, 321, 322, 5, 99, 0, 0, 322, 323, 5, 116, 0, 0, 323, 42, 1, 0, 0, 0, 324, 325, 5, 97, 0, 0, 325, 326, 5, 108, 0, 0, 326, 327, 5, 105, 0, 0, 327, 328, 5, 97, 0, 0, 328, 329, 5, 115, 0, 0, 329, 44, 1, 0, 0, 0, 330, 331, 5, 97, 0, 0, 331, 332, 5, 108, 0, 0, 332, 333, 5, 108, 0, 0, 333, 46, 1, 0, 0, 0, 334, 335, 5, 97, 0, 0, 335, 336, 5, 110, 0, 0, 336, 337, 5, 100, 0, 0, 337, 48, 1, 0, 0, 0, 338, 339, 5, 97, 0, 0, 339, 340, 5, 115, 0, 0, 340, 50, 1, 0, 0, 0, 341, 342, 5, 97, 0, 0, 342, 343, 5, 115, 0, 0, 343, 344, 5, 115, 0, 0, 344, 345, 5, 105, 0, 0, 345, 346, 5, 103, 0, 0, 346, 347, 5, 110, 0, 0, 347, 52, 1, 0, 0, 0, 348, 349, 5, 97, 0, 0, 349, 350, 5, 115, 0, 0, 350, 351, 5, 115, 0, 0, 351, 352, 5, 111, 0, 0, 352, 353, 5, 99, 0, 0, 353, 54, 1, 0, 0, 0, 354, 355, 5, 98, 0, 0, 355, 356, 5, 101, 0, 0, 356, 357, 5, 104, 0, 0, 357, 358, 5, 97, 0, 0, 358, 359, 5, 118, 0, 0, 359, 360, 5, 105, 0, 0, 360, 361, 5, 111, 0, 0, 361, 362, 5, 114, 0, 0, 362, 56, 1, 0, 0, 0, 363, 364, 5, 98, 0, 0, 364, 365, 5, 105, 0, 0, 365, 366, 5, 110, 0, 0, 366, 367, 5, 100, 0, 0, 367, 368, 5, 105, 0, 0, 368, 369, 5, 110, 0, 0, 369, 370, 5, 103, 0, 0, 370, 58, 1, 0, 0, 0, 371, 372, 5, 98, 0, 0, 372, 373, 5, 111, 0, 0, 373, 374, 5, 111, 0, 0, 374, 375, 5, 108, 0, 0, 375, 60, 1, 0, 0, 0, 376, 377, 5, 98, 0, 0, 377, 378, 5, 121, 0, 0, 378, 62, 1, 0, 0, 0, 379, 380, 5, 99, 0, 0, 380, 381, 5, 104, 0, 0, 381, 382, 5, 97, 0, 0, 382, 383, 5, 105, 0, 0, 383, 384, 5, 110, 0, 0, 384, 385, 5, 115, 0, 0, 385, 64, 1, 0, 0, 0, 386, 387, 5, 99, 0, 0, 387, 388, 5, 108, 0, 0, 388, 389, 5, 97, 0, 0, 389, 390, 5, 115, 0, 0, 390, 391, 5, 115, 0, 0, 391, 66, 1, 0, 0, 0, 392, 393, 5, 99, 0, 0, 393, 394, 5, 108, 0, 0, 394, 395, 5, 97, 0, 0, 395, 396, 5, 115, 0, 0, 396, 397, 5, 115, 0, 0, 397, 398, 5, 105, 0, 0, 398, 399, 5, 102, 0, 0, 399, 400, 5, 105, 0, 0, 400, 401, 5, 101, 0, 0, 401, 402, 5, 114, 0, 0, 402, 68, 1, 0, 0, 0, 403, 404, 5, 99, 0, 0, 404, 405, 5, 111, 0, 0, 405, 406, 5, 109, 0, 0, 406, 407, 5, 109, 0, 0, 407, 408, 5, 101, 0, 0, 408, 409, 5, 110, 0, 0, 409, 410, 5, 116, 0, 0, 410, 70, 1, 0, 0, 0, 411, 412, 5, 99, 0, 0, 412, 413, 5, 111, 0, 0, 413, 414, 5, 109, 0, 0, 414, 415, 5, 112, 0, 0, 415, 416, 5, 111, 0, 0, 416, 417, 5, 115, 0, 0, 417, 418, 5, 105, 0, 0, 418, 419, 5, 116, 0, 0, 419, 420, 5, 101, 0, 0, 420, 72, 1, 0, 0, 0, 421, 422, 5, 99, 0, 0, 422, 423, 5, 111, 0, 0, 423, 424, 5, 110, 0, 0, 424, 425, 5, 106, 0, 0, 425, 426, 5, 117, 0, 0, 426, 427, 5, 103, 0, 0, 427, 428, 5, 97, 0, 0, 428, 429, 5, 116, 0, 0, 429, 430, 5, 101, 0, 0, 430, 74, 1, 0, 0, 0, 431, 432, 5, 99, 0, 0, 432, 433, 5, 111, 0, 0, 433, 434, 5, 110, 0, 0, 434, 435, 5, 106, 0, 0, 435, 436, 5, 117, 0, 0, 436, 437, 5, 103, 0, 0, 437, 438, 5, 97, 0, 0, 438, 439, 5, 116, 0, 0, 439, 440, 5, 101, 0, 0, 440, 441, 5, 115, 0, 0, 441, 76, 1, 0, 0, 0, 442, 443, 5, 99, 0, 0, 443, 444, 5, 111, 0, 0, 444, 445, 5, 110, 0, 0, 445, 446, 5, 106, 0, 0, 446, 447, 5, 117, 0, 0, 447, 448, 5, 103, 0, 0, 448, 449, 5, 97, 0, 0, 449, 450, 5, 116, 0, 0, 450, 451, 5, 105, 0, 0, 451, 452, 5, 111, 0, 0, 452, 453, 5, 110, 0, 0, 453, 78, 1, 0, 0, 0, 454, 455, 5, 99, 0, 0, 455, 456, 5, 111, 0, 0, 456, 457, 5, 110, 0, 0, 457, 458, 5, 110, 0, 0, 458, 459, 5, 101, 0, 0, 459, 460, 5, 99, 0, 0, 460, 461, 5, 116, 0, 0, 461, 462, 5, 111, 0, 0, 462, 463, 5, 114, 0, 0, 463, 80, 1, 0, 0, 0, 464, 465, 5, 100, 0, 0, 465, 466, 5, 97, 0, 0, 466, 467, 5, 116, 0, 0, 467, 468, 5, 97, 0, 0, 468, 469, 5, 116, 0, 0, 469, 470, 5, 121, 0, 0, 470, 471, 5, 112, 0, 0, 471, 472, 5, 101, 0, 0, 472, 82, 1, 0, 0, 0, 473, 474, 5, 100, 0, 0, 474, 475, 5, 101, 0, 0, 475, 476, 5, 102, 0, 0, 476, 477, 5, 97, 0, 0, 477, 478, 5, 117, 0, 0, 478, 479, 5, 108, 0, 0, 479, 480, 5, 116, 0, 0, 480, 84, 1, 0, 0, 0, 481, 482, 5, 100, 0, 0, 482, 483, 5, 101, 0, 0, 483, 484, 5, 112, 0, 0, 484, 485, 5, 101, 0, 0, 485, 486, 5, 110, 0, 0, 486, 487, 5, 100, 0, 0, 487, 488, 5, 101, 0, 0, 488, 489, 5, 110, 0, 0, 489, 490, 5, 99, 0, 0, 490, 491, 5, 121, 0, 0, 491, 86, 1, 0, 0, 0, 492, 493, 5, 100, 0, 0, 493, 494, 5, 101, 0, 0, 494, 495, 5, 114, 0, 0, 495, 496, 5, 105, 0, 0, 496, 497, 5, 118, 0, 0, 497, 498, 5, 101, 0, 0, 498, 499, 5, 100, 0, 0, 499, 88, 1, 0, 0, 0, 500, 501, 5, 100, 0, 0, 501, 502, 5, 105, 0, 0, 502, 503, 5, 102, 0, 0, 503, 504, 5, 102, 0, 0, 504, 505, 5, 101, 0, 0, 505, 506, 5, 114, 0, 0, 506, 507, 5, 101, 0, 0, 507, 508, 5, 110, 0, 0, 508, 509, 5, 99, 0, 0, 509, 510, 5, 101, 0, 0, 510, 511, 5, 115, 0, 0, 511, 90, 1, 0, 0, 0, 512, 513, 5, 100, 0, 0, 513, 514, 5, 105, 0, 0, 514, 515, 5, 115, 0, 0, 515, 516, 5, 106, 0, 0, 516, 517, 5, 111, 0, 0, 517, 518, 5, 105, 0, 0, 518, 519, 5, 110, 0, 0, 519, 520, 5, 105, 0, 0, 520, 521, 5, 110, 0, 0, 521, 522, 5, 103, 0, 0, 522, 92, 1, 0, 0, 0, 523, 524, 5, 100, 0, 0, 524, 525, 5, 105, 0, 0, 525, 526, 5, 115, 0, 0, 526, 527, 5, 106, 0, 0, 527, 528, 5, 111, 0, 0, 528, 529, 5, 105, 0, 0, 529, 530, 5, 110, 0, 0, 530, 531, 5, 116, 0, 0, 531, 94, 1, 0, 0, 0, 532, 533, 5, 100, 0, 0, 533, 534, 5, 111, 0, 0, 534, 535, 5, 99, 0, 0, 535, 96, 1, 0, 0, 0, 536, 537, 5, 101, 0, 0, 537, 538, 5, 108, 0, 0, 538, 539, 5, 115, 0, 0, 539, 540, 5, 101, 0, 0, 540, 98, 1, 0, 0, 0, 541, 542, 5, 101, 0, 0, 542, 543, 5, 110, 0, 0, 543, 544, 5, 100, 0, 0, 544, 100, 1, 0, 0, 0, 545, 546, 5, 101, 0, 0, 546, 547, 5, 120, 0, 0, 547, 548, 5, 112, 0, 0, 548, 549, 5, 114, 0, 0, 549, 102, 1, 0, 0, 0, 550, 551, 5, 102, 0, 0, 551, 552, 5, 97, 0, 0, 552, 553, 5, 108, 0, 0, 553, 554, 5, 115, 0, 0, 554, 555, 5, 101, 0, 0, 555, 104, 1, 0, 0, 0, 556, 557, 5, 102, 0, 0, 557, 558, 5, 101, 0, 0, 558, 559, 5, 97, 0, 0, 559, 560, 5, 116, 0, 0, 560, 561, 5, 117, 0, 0, 561, 562, 5, 114, 0, 0, 562, 563, 5, 101, 0, 0, 563, 106, 1, 0, 0, 0, 564, 565, 5, 102, 0, 0, 565, 566, 5, 101, 0, 0, 566, 567, 5, 97, 0, 0, 567, 568, 5, 116, 0, 0, 568, 569, 5, 117, 0, 0, 569, 570, 5, 114, 0, 0, 570, 571, 5, 101, 0, 0, 571, 572, 5, 100, 0, 0, 572, 108, 1, 0, 0, 0, 573, 574, 5, 102, 0, 0, 574, 575, 5, 101, 0, 0, 575, 576, 5, 97, 0, 0, 576, 577, 5, 116, 0, 0, 577, 578, 5, 117, 0, 0, 578, 579, 5, 114, 0, 0, 579, 580, 5, 105, 0, 0, 580, 581, 5, 110, 0, 0, 581, 582, 5, 103, 0, 0, 582, 110, 1, 0, 0, 0, 583, 584, 5, 102, 0, 0, 584, 585, 5, 105, 0, 0, 585, 586, 5, 108, 0, 0, 586, 587, 5, 116, 0, 0, 587, 588, 5, 101, 0, 0, 588, 589, 5, 114, 0, 0, 589, 112, 1, 0, 0, 0, 590, 591, 5, 102, 0, 0, 591, 592, 5, 105, 0, 0, 592, 593, 5, 114, 0, 0, 593, 594, 5, 115, 0, 0, 594, 595, 5, 116, 0, 0, 595, 114, 1, 0, 0, 0, 596, 597, 5, 102, 0, 0, 597, 598, 5, 108, 0, 0, 598, 599, 5, 111, 0, 0, 599, 600, 5, 119, 0, 0, 600, 116, 1, 0, 0, 0, 601, 602, 5, 102, 0, 0, 602, 603, 5, 111, 0, 0, 603, 604, 5, 114, 0, 0, 604, 118, 1, 0, 0, 0, 605, 606, 5, 102, 0, 0, 606, 607, 5, 114, 0, 0, 607, 608, 5, 111, 0, 0, 608, 609, 5, 109, 0, 0, 609, 120, 1, 0, 0, 0, 610, 611, 5, 102, 0, 0, 611, 612, 5, 117, 0, 0, 612, 613, 5, 110, 0, 0, 613, 614, 5, 99, 0, 0, 614, 615, 5, 116, 0, 0, 615, 616, 5, 105, 0, 0, 616, 617, 5, 111, 0, 0, 617, 618, 5, 110, 0, 0, 618, 122, 1, 0, 0, 0, 619, 620, 5, 104, 0, 0, 620, 621, 5, 97, 0, 0, 621, 622, 5, 115, 0, 0, 622, 623, 5, 116, 0, 0, 623, 624, 5, 121, 0, 0, 624, 625, 5, 112, 0, 0, 625, 626, 5, 101, 0, 0, 626, 124, 1, 0, 0, 0, 627, 628, 5, 105, 0, 0, 628, 629, 5, 102, 0, 0, 629, 126, 1, 0, 0, 0, 630, 631, 5, 105, 0, 0, 631, 632, 5, 110, 0, 0, 632, 633, 5, 116, 0, 0, 633, 634, 5, 101, 0, 0, 634, 635, 5, 114, 0, 0, 635, 636, 5, 115, 0, 0, 636, 637, 5, 101, 0, 0, 637, 638, 5, 99, 0, 0, 638, 639, 5, 116, 0, 0, 639, 640, 5, 115, 0, 0, 640, 128, 1, 0, 0, 0, 641, 642, 5, 105, 0, 0, 642, 643, 5, 109, 0, 0, 643, 644, 5, 112, 0, 0, 644, 645, 5, 108, 0, 0, 645, 646, 5, 105, 0, 0, 646, 647, 5, 101, 0, 0, 647, 648, 5, 115, 0, 0, 648, 130, 1, 0, 0, 0, 649, 650, 5, 105, 0, 0, 650, 651, 5, 109, 0, 0, 651, 652, 5, 112, 0, 0, 652, 653, 5, 111, 0, 0, 653, 654, 5, 114, 0, 0, 654, 655, 5, 116, 0, 0, 655, 132, 1, 0, 0, 0, 656, 657, 5, 105, 0, 0, 657, 658, 5, 110, 0, 0, 658, 134, 1, 0, 0, 0, 659, 660, 5, 105, 0, 0, 660, 661, 5, 110, 0, 0, 661, 662, 5, 111, 0, 0, 662, 663, 5, 117, 0, 0, 663, 664, 5, 116, 0, 0, 664, 136, 1, 0, 0, 0, 665, 666, 5, 105, 0, 0, 666, 667, 5, 110, 0, 0, 667, 668, 5, 116, 0, 0, 668, 669, 5, 101, 0, 0, 669, 670, 5, 114, 0, 0, 670, 671, 5, 97, 0, 0, 671, 672, 5, 99, 0, 0, 672, 673, 5, 116, 0, 0, 673, 674, 5, 105, 0, 0, 674, 675, 5, 111, 0, 0, 675, 676, 5, 110, 0, 0, 676, 138, 1, 0, 0, 0, 677, 678, 5, 105, 0, 0, 678, 679, 5, 110, 0, 0, 679, 680, 5, 118, 0, 0, 680, 140, 1, 0, 0, 0, 681, 682, 5, 105, 0, 0, 682, 683, 5, 110, 0, 0, 683, 684, 5, 118, 0, 0, 684, 685, 5, 101, 0, 0, 685, 686, 5, 114, 0, 0, 686, 687, 5, 115, 0, 0, 687, 688, 5, 101, 0, 0, 688, 142, 1, 0, 0, 0, 689, 690, 5, 105, 0, 0, 690, 691, 5, 110, 0, 0, 691, 692, 5, 118, 0, 0, 692, 693, 5, 101, 0, 0, 693, 694, 5, 114, 0, 0, 694, 695, 5, 116, 0, 0, 695, 696, 5, 105, 0, 0, 696, 697, 5, 110, 0, 0, 697, 698, 5, 103, 0, 0, 698, 144, 1, 0, 0, 0, 699, 700, 5, 105, 0, 0, 700, 701, 5, 115, 0, 0, 701, 702, 5, 116, 0, 0, 702, 703, 5, 121, 0, 0, 703, 704, 5, 112, 0, 0, 704, 705, 5, 101, 0, 0, 705, 146, 1, 0, 0, 0, 706, 707, 5, 108, 0, 0, 707, 708, 5, 97, 0, 0, 708, 709, 5, 110, 0, 0, 709, 710, 5, 103, 0, 0, 710, 711, 5, 117, 0, 0, 711, 712, 5, 97, 0, 0, 712, 713, 5, 103, 0, 0, 713, 714, 5, 101, 0, 0, 714, 148, 1, 0, 0, 0, 715, 716, 5, 109, 0, 0, 716, 717, 5, 101, 0, 0, 717, 718, 5, 109, 0, 0, 718, 719, 5, 98, 0, 0, 719, 720, 5, 101, 0, 0, 720, 721, 5, 114, 0, 0, 721, 150, 1, 0, 0, 0, 722, 723, 5, 109, 0, 0, 723, 724, 5, 101, 0, 0, 724, 725, 5, 116, 0, 0, 725, 726, 5, 97, 0, 0, 726, 727, 5, 99, 0, 0, 727, 728, 5, 108, 0, 0, 728, 729, 5, 97, 0, 0, 729, 730, 5, 115, 0, 0, 730, 731, 5, 115, 0, 0, 731, 152, 1, 0, 0, 0, 732, 733, 5, 109, 0, 0, 733, 734, 5, 101, 0, 0, 734, 735, 5, 116, 0, 0, 735, 736, 5, 97, 0, 0, 736, 737, 5, 100, 0, 0, 737, 738, 5, 97, 0, 0, 738, 739, 5, 116, 0, 0, 739, 740, 5, 97, 0, 0, 740, 154, 1, 0, 0, 0, 741, 742, 5, 109, 0, 0, 742, 743, 5, 117, 0, 0, 743, 744, 5, 108, 0, 0, 744, 745, 5, 116, 0, 0, 745, 746, 5, 105, 0, 0, 746, 747, 5, 112, 0, 0, 747, 748, 5, 108, 0, 0, 748, 749, 5, 105, 0, 0, 749, 750, 5, 99, 0, 0, 750, 751, 5, 105, 0, 0, 751, 752, 5, 116, 0, 0, 752, 753, 5, 121, 0, 0, 753, 156, 1, 0, 0, 0, 754, 755, 5, 110, 0, 0, 755, 756, 5, 97, 0, 0, 756, 757, 5, 109, 0, 0, 757, 758, 5, 101, 0, 0, 758, 759, 5, 115, 0, 0, 759, 760, 5, 112, 0, 0, 760, 761, 5, 97, 0, 0, 761, 762, 5, 99, 0, 0, 762, 763, 5, 101, 0, 0, 763, 158, 1, 0, 0, 0, 764, 765, 5, 110, 0, 0, 765, 766, 5, 111, 0, 0, 766, 767, 5, 110, 0, 0, 767, 768, 5, 117, 0, 0, 768, 769, 5, 110, 0, 0, 769, 770, 5, 105, 0, 0, 770, 771, 5, 113, 0, 0, 771, 772, 5, 117, 0, 0, 772, 773, 5, 101, 0, 0, 773, 160, 1, 0, 0, 0, 774, 775, 5, 110, 0, 0, 775, 776, 5, 111, 0, 0, 776, 777, 5, 116, 0, 0, 777, 162, 1, 0, 0, 0, 778, 779, 5, 110, 0, 0, 779, 780, 5, 117, 0, 0, 780, 781, 5, 108, 0, 0, 781, 782, 5, 108, 0, 0, 782, 164, 1, 0, 0, 0, 783, 784, 5, 111, 0, 0, 784, 785, 5, 102, 0, 0, 785, 166, 1, 0, 0, 0, 786, 787, 5, 111, 0, 0, 787, 788, 5, 114, 0, 0, 788, 168, 1, 0, 0, 0, 789, 790, 5, 111, 0, 0, 790, 791, 5, 114, 0, 0, 791, 792, 5, 100, 0, 0, 792, 793, 5, 101, 0, 0, 793, 794, 5, 114, 0, 0, 794, 795, 5, 101, 0, 0, 795, 796, 5, 100, 0, 0, 796, 170, 1, 0, 0, 0, 797, 798, 5, 111, 0, 0, 798, 799, 5, 117, 0, 0, 799, 800, 5, 116, 0, 0, 800, 172, 1, 0, 0, 0, 801, 802, 5, 112, 0, 0, 802, 803, 5, 97, 0, 0, 803, 804, 5, 99, 0, 0, 804, 805, 5, 107, 0, 0, 805, 806, 5, 97, 0, 0, 806, 807, 5, 103, 0, 0, 807, 808, 5, 101, 0, 0, 808, 174, 1, 0, 0, 0, 809, 810, 5, 112, 0, 0, 810, 811, 5, 111, 0, 0, 811, 812, 5, 114, 0, 0, 812, 813, 5, 116, 0, 0, 813, 814, 5, 105, 0, 0, 814, 815, 5, 111, 0, 0, 815, 816, 5, 110, 0, 0, 816, 176, 1, 0, 0, 0, 817, 818, 5, 112, 0, 0, 818, 819, 5, 114, 0, 0, 819, 820, 5, 101, 0, 0, 820, 821, 5, 100, 0, 0, 821, 822, 5, 105, 0, 0, 822, 823, 5, 99, 0, 0, 823, 824, 5, 97, 0, 0, 824, 825, 5, 116, 0, 0, 825, 826, 5, 101, 0, 0, 826, 178, 1, 0, 0, 0, 827, 828, 5, 112, 0, 0, 828, 829, 5, 114, 0, 0, 829, 830, 5, 105, 0, 0, 830, 831, 5, 118, 0, 0, 831, 832, 5, 97, 0, 0, 832, 833, 5, 116, 0, 0, 833, 834, 5, 101, 0, 0, 834, 180, 1, 0, 0, 0, 835, 836, 5, 112, 0, 0, 836, 837, 5, 114, 0, 0, 837, 838, 5, 111, 0, 0, 838, 839, 5, 116, 0, 0, 839, 840, 5, 101, 0, 0, 840, 841, 5, 99, 0, 0, 841, 842, 5, 116, 0, 0, 842, 843, 5, 101, 0, 0, 843, 844, 5, 100, 0, 0, 844, 182, 1, 0, 0, 0, 845, 846, 5, 112, 0, 0, 846, 847, 5, 117, 0, 0, 847, 848, 5, 98, 0, 0, 848, 849, 5, 108, 0, 0, 849, 850, 5, 105, 0, 0, 850, 851, 5, 99, 0, 0, 851, 184, 1, 0, 0, 0, 852, 853, 5, 114, 0, 0, 853, 854, 5, 101, 0, 0, 854, 855, 5, 97, 0, 0, 855, 856, 5, 100, 0, 0, 856, 857, 5, 111, 0, 0, 857, 858, 5, 110, 0, 0, 858, 859, 5, 108, 0, 0, 859, 860, 5, 121, 0, 0, 860, 186, 1, 0, 0, 0, 861, 862, 5, 114, 0, 0, 862, 863, 5, 101, 0, 0, 863, 864, 5, 100, 0, 0, 864, 865, 5, 101, 0, 0, 865, 866, 5, 102, 0, 0, 866, 867, 5, 105, 0, 0, 867, 868, 5, 110, 0, 0, 868, 869, 5, 101, 0, 0, 869, 870, 5, 115, 0, 0, 870, 188, 1, 0, 0, 0, 871, 872, 5, 114, 0, 0, 872, 873, 5, 101, 0, 0, 873, 874, 5, 100, 0, 0, 874, 875, 5, 101, 0, 0, 875, 876, 5, 102, 0, 0, 876, 877, 5, 105, 0, 0, 877, 878, 5, 110, 0, 0, 878, 879, 5, 105, 0, 0, 879, 880, 5, 116, 0, 0, 880, 881, 5, 105, 0, 0, 881, 882, 5, 111, 0, 0, 882, 883, 5, 110, 0, 0, 883, 190, 1, 0, 0, 0, 884, 885, 5, 114, 0, 0, 885, 886, 5, 101, 0, 0, 886, 887, 5, 102, 0, 0, 887, 888, 5, 101, 0, 0, 888, 889, 5, 114, 0, 0, 889, 890, 5, 101, 0, 0, 890, 891, 5, 110, 0, 0, 891, 892, 5, 99, 0, 0, 892, 893, 5, 101, 0, 0, 893, 894, 5, 115, 0, 0, 894, 192, 1, 0, 0, 0, 895, 896, 5, 114, 0, 0, 896, 897, 5, 101, 0, 0, 897, 898, 5, 112, 0, 0, 898, 194, 1, 0, 0, 0, 899, 900, 5, 114, 0, 0, 900, 901, 5, 101, 0, 0, 901, 902, 5, 116, 0, 0, 902, 903, 5, 117, 0, 0, 903, 904, 5, 114, 0, 0, 904, 905, 5, 110, 0, 0, 905, 196, 1, 0, 0, 0, 906, 907, 5, 115, 0, 0, 907, 908, 5, 112, 0, 0, 908, 909, 5, 101, 0, 0, 909, 910, 5, 99, 0, 0, 910, 911, 5, 105, 0, 0, 911, 912, 5, 97, 0, 0, 912, 913, 5, 108, 0, 0, 913, 914, 5, 105, 0, 0, 914, 915, 5, 122, 0, 0, 915, 916, 5, 97, 0, 0, 916, 917, 5, 116, 0, 0, 917, 918, 5, 105, 0, 0, 918, 919, 5, 111, 0, 0, 919, 920, 5, 110, 0, 0, 920, 198, 1, 0, 0, 0, 921, 922, 5, 115, 0, 0, 922, 923, 5, 112, 0, 0, 923, 924, 5, 101, 0, 0, 924, 925, 5, 99, 0, 0, 925, 926, 5, 105, 0, 0, 926, 927, 5, 97, 0, 0, 927, 928, 5, 108, 0, 0, 928, 929, 5, 105, 0, 0, 929, 930, 5, 122, 0, 0, 930, 931, 5, 101, 0, 0, 931, 932, 5, 115, 0, 0, 932, 200, 1, 0, 0, 0, 933, 934, 5, 115, 0, 0, 934, 935, 5, 116, 0, 0, 935, 936, 5, 101, 0, 0, 936, 937, 5, 112, 0, 0, 937, 202, 1, 0, 0, 0, 938, 939, 5, 115, 0, 0, 939, 940, 5, 116, 0, 0, 940, 941, 5, 114, 0, 0, 941, 942, 5, 117, 0, 0, 942, 943, 5, 99, 0, 0, 943, 944, 5, 116, 0, 0, 944, 204, 1, 0, 0, 0, 945, 946, 5, 115, 0, 0, 946, 947, 5, 117, 0, 0, 947, 948, 5, 98, 0, 0, 948, 949, 5, 99, 0, 0, 949, 950, 5, 108, 0, 0, 950, 951, 5, 97, 0, 0, 951, 952, 5, 115, 0, 0, 952, 953, 5, 115, 0, 0, 953, 954, 5, 105, 0, 0, 954, 955, 5, 102, 0, 0, 955, 956, 5, 105, 0, 0, 956, 957, 5, 101, 0, 0, 957, 958, 5, 114, 0, 0, 958, 206, 1, 0, 0, 0, 959, 960, 5, 115, 0, 0, 960, 961, 5, 117, 0, 0, 961, 962, 5, 98, 0, 0, 962, 963, 5, 115, 0, 0, 963, 964, 5, 101, 0, 0, 964, 965, 5, 116, 0, 0, 965, 208, 1, 0, 0, 0, 966, 967, 5, 115, 0, 0, 967, 968, 5, 117, 0, 0, 968, 969, 5, 98, 0, 0, 969, 970, 5, 115, 0, 0, 970, 971, 5, 101, 0, 0, 971, 972, 5, 116, 0, 0, 972, 973, 5, 115, 0, 0, 973, 210, 1, 0, 0, 0, 974, 975, 5, 115, 0, 0, 975, 976, 5, 117, 0, 0, 976, 977, 5, 98, 0, 0, 977, 978, 5, 116, 0, 0, 978, 979, 5, 121, 0, 0, 979, 980, 5, 112, 0, 0, 980, 981, 5, 101, 0, 0, 981, 212, 1, 0, 0, 0, 982, 983, 5, 115, 0, 0, 983, 984, 5, 117, 0, 0, 984, 985, 5, 99, 0, 0, 985, 986, 5, 99, 0, 0, 986, 987, 5, 101, 0, 0, 987, 988, 5, 115, 0, 0, 988, 989, 5, 115, 0, 0, 989, 990, 5, 105, 0, 0, 990, 991, 5, 111, 0, 0, 991, 992, 5, 110, 0, 0, 992, 214, 1, 0, 0, 0, 993, 994, 5, 116, 0, 0, 994, 995, 5, 104, 0, 0, 995, 996, 5, 101, 0, 0, 996, 997, 5, 110, 0, 0, 997, 216, 1, 0, 0, 0, 998, 999, 5, 116, 0, 0, 999, 1000, 5, 111, 0, 0, 1000, 218, 1, 0, 0, 0, 1001, 1002, 5, 116, 0, 0, 1002, 1003, 5, 114, 0, 0, 1003, 1004, 5, 117, 0, 0, 1004, 1005, 5, 101, 0, 0, 1005, 220, 1, 0, 0, 0, 1006, 1007, 5, 116, 0, 0, 1007, 1008, 5, 121, 0, 0, 1008, 1009, 5, 112, 0, 0, 1009, 1010, 5, 101, 0, 0, 1010, 222, 1, 0, 0, 0, 1011, 1012, 5, 116, 0, 0, 1012, 1013, 5, 121, 0, 0, 1013, 1014, 5, 112, 0, 0, 1014, 1015, 5, 101, 0, 0, 1015, 1016, 5, 100, 0, 0, 1016, 224, 1, 0, 0, 0, 1017, 1018, 5, 116, 0, 0, 1018, 1019, 5, 121, 0, 0, 1019, 1020, 5, 112, 0, 0, 1020, 1021, 5, 105, 0, 0, 1021, 1022, 5, 110, 0, 0, 1022, 1023, 5, 103, 0, 0, 1023, 226, 1, 0, 0, 0, 1024, 1025, 5, 117, 0, 0, 1025, 1026, 5, 110, 0, 0, 1026, 1027, 5, 105, 0, 0, 1027, 1028, 5, 111, 0, 0, 1028, 1029, 5, 110, 0, 0, 1029, 1030, 5, 115, 0, 0, 1030, 228, 1, 0, 0, 0, 1031, 1032, 5, 120, 0, 0, 1032, 1033, 5, 111, 0, 0, 1033, 1034, 5, 114, 0, 0, 1034, 230, 1, 0, 0, 0, 1035, 1036, 9, 0, 0, 0, 1036, 232, 1, 0, 0, 0, 8, 0, 274, 280, 285, 290, 296, 302, 304, 1, 6, 0, 0] \ No newline at end of file +[4, 0, 128, 1103, 6, -1, 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, 2, 41, 7, 41, 2, 42, 7, 42, 2, 43, 7, 43, 2, 44, 7, 44, 2, 45, 7, 45, 2, 46, 7, 46, 2, 47, 7, 47, 2, 48, 7, 48, 2, 49, 7, 49, 2, 50, 7, 50, 2, 51, 7, 51, 2, 52, 7, 52, 2, 53, 7, 53, 2, 54, 7, 54, 2, 55, 7, 55, 2, 56, 7, 56, 2, 57, 7, 57, 2, 58, 7, 58, 2, 59, 7, 59, 2, 60, 7, 60, 2, 61, 7, 61, 2, 62, 7, 62, 2, 63, 7, 63, 2, 64, 7, 64, 2, 65, 7, 65, 2, 66, 7, 66, 2, 67, 7, 67, 2, 68, 7, 68, 2, 69, 7, 69, 2, 70, 7, 70, 2, 71, 7, 71, 2, 72, 7, 72, 2, 73, 7, 73, 2, 74, 7, 74, 2, 75, 7, 75, 2, 76, 7, 76, 2, 77, 7, 77, 2, 78, 7, 78, 2, 79, 7, 79, 2, 80, 7, 80, 2, 81, 7, 81, 2, 82, 7, 82, 2, 83, 7, 83, 2, 84, 7, 84, 2, 85, 7, 85, 2, 86, 7, 86, 2, 87, 7, 87, 2, 88, 7, 88, 2, 89, 7, 89, 2, 90, 7, 90, 2, 91, 7, 91, 2, 92, 7, 92, 2, 93, 7, 93, 2, 94, 7, 94, 2, 95, 7, 95, 2, 96, 7, 96, 2, 97, 7, 97, 2, 98, 7, 98, 2, 99, 7, 99, 2, 100, 7, 100, 2, 101, 7, 101, 2, 102, 7, 102, 2, 103, 7, 103, 2, 104, 7, 104, 2, 105, 7, 105, 2, 106, 7, 106, 2, 107, 7, 107, 2, 108, 7, 108, 2, 109, 7, 109, 2, 110, 7, 110, 2, 111, 7, 111, 2, 112, 7, 112, 2, 113, 7, 113, 2, 114, 7, 114, 2, 115, 7, 115, 2, 116, 7, 116, 2, 117, 7, 117, 2, 118, 7, 118, 2, 119, 7, 119, 2, 120, 7, 120, 2, 121, 7, 121, 2, 122, 7, 122, 2, 123, 7, 123, 2, 124, 7, 124, 2, 125, 7, 125, 2, 126, 7, 126, 2, 127, 7, 127, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 2, 1, 2, 1, 3, 1, 3, 1, 4, 1, 4, 1, 4, 1, 5, 1, 5, 1, 5, 1, 5, 1, 6, 1, 6, 1, 7, 1, 7, 1, 8, 1, 8, 1, 9, 1, 9, 1, 10, 1, 10, 1, 11, 1, 11, 1, 11, 1, 12, 1, 12, 1, 12, 1, 12, 1, 13, 4, 13, 292, 8, 13, 11, 13, 12, 13, 293, 1, 13, 1, 13, 1, 14, 1, 14, 3, 14, 300, 8, 14, 1, 15, 4, 15, 303, 8, 15, 11, 15, 12, 15, 304, 1, 16, 4, 16, 308, 8, 16, 11, 16, 12, 16, 309, 1, 16, 1, 16, 4, 16, 314, 8, 16, 11, 16, 12, 16, 315, 1, 17, 1, 17, 1, 17, 1, 17, 5, 17, 322, 8, 17, 10, 17, 12, 17, 325, 9, 17, 1, 17, 1, 17, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 20, 1, 20, 1, 20, 1, 21, 1, 21, 1, 21, 1, 21, 1, 21, 1, 21, 1, 22, 1, 22, 1, 22, 1, 22, 1, 23, 1, 23, 1, 23, 1, 23, 1, 24, 1, 24, 1, 24, 1, 25, 1, 25, 1, 25, 1, 25, 1, 25, 1, 25, 1, 25, 1, 26, 1, 26, 1, 26, 1, 26, 1, 26, 1, 26, 1, 27, 1, 27, 1, 27, 1, 27, 1, 27, 1, 27, 1, 27, 1, 27, 1, 27, 1, 28, 1, 28, 1, 28, 1, 28, 1, 28, 1, 28, 1, 28, 1, 28, 1, 29, 1, 29, 1, 29, 1, 29, 1, 29, 1, 30, 1, 30, 1, 30, 1, 31, 1, 31, 1, 31, 1, 31, 1, 31, 1, 31, 1, 31, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 33, 1, 33, 1, 33, 1, 33, 1, 33, 1, 33, 1, 33, 1, 33, 1, 33, 1, 33, 1, 33, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 1, 35, 1, 35, 1, 35, 1, 35, 1, 35, 1, 35, 1, 35, 1, 35, 1, 35, 1, 35, 1, 36, 1, 36, 1, 36, 1, 36, 1, 36, 1, 36, 1, 36, 1, 36, 1, 36, 1, 36, 1, 37, 1, 37, 1, 37, 1, 37, 1, 37, 1, 37, 1, 37, 1, 37, 1, 37, 1, 37, 1, 37, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 39, 1, 39, 1, 39, 1, 39, 1, 39, 1, 39, 1, 39, 1, 39, 1, 39, 1, 39, 1, 40, 1, 40, 1, 40, 1, 40, 1, 40, 1, 40, 1, 40, 1, 40, 1, 40, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 42, 1, 42, 1, 42, 1, 42, 1, 42, 1, 42, 1, 42, 1, 42, 1, 42, 1, 42, 1, 42, 1, 43, 1, 43, 1, 43, 1, 43, 1, 43, 1, 43, 1, 43, 1, 43, 1, 44, 1, 44, 1, 44, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 46, 1, 46, 1, 46, 1, 46, 1, 46, 1, 46, 1, 46, 1, 46, 1, 46, 1, 46, 1, 46, 1, 47, 1, 47, 1, 47, 1, 47, 1, 47, 1, 47, 1, 47, 1, 47, 1, 47, 1, 48, 1, 48, 1, 48, 1, 48, 1, 49, 1, 49, 1, 49, 1, 49, 1, 49, 1, 50, 1, 50, 1, 50, 1, 50, 1, 51, 1, 51, 1, 51, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 53, 1, 53, 1, 53, 1, 53, 1, 53, 1, 53, 1, 54, 1, 54, 1, 54, 1, 54, 1, 54, 1, 54, 1, 54, 1, 54, 1, 55, 1, 55, 1, 55, 1, 55, 1, 55, 1, 55, 1, 55, 1, 55, 1, 55, 1, 56, 1, 56, 1, 56, 1, 56, 1, 56, 1, 56, 1, 56, 1, 56, 1, 56, 1, 56, 1, 57, 1, 57, 1, 57, 1, 57, 1, 57, 1, 57, 1, 57, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 60, 1, 60, 1, 60, 1, 60, 1, 61, 1, 61, 1, 61, 1, 61, 1, 61, 1, 62, 1, 62, 1, 62, 1, 62, 1, 62, 1, 62, 1, 62, 1, 62, 1, 62, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 64, 1, 64, 1, 64, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 68, 1, 68, 1, 68, 1, 69, 1, 69, 1, 69, 1, 70, 1, 70, 1, 70, 1, 70, 1, 70, 1, 70, 1, 71, 1, 71, 1, 71, 1, 72, 1, 72, 1, 72, 1, 72, 1, 72, 1, 72, 1, 72, 1, 72, 1, 72, 1, 72, 1, 72, 1, 72, 1, 73, 1, 73, 1, 73, 1, 73, 1, 74, 1, 74, 1, 74, 1, 74, 1, 74, 1, 74, 1, 74, 1, 74, 1, 75, 1, 75, 1, 75, 1, 75, 1, 75, 1, 75, 1, 75, 1, 75, 1, 75, 1, 75, 1, 76, 1, 76, 1, 76, 1, 76, 1, 76, 1, 76, 1, 76, 1, 77, 1, 77, 1, 77, 1, 77, 1, 77, 1, 77, 1, 77, 1, 77, 1, 77, 1, 78, 1, 78, 1, 78, 1, 78, 1, 78, 1, 78, 1, 78, 1, 79, 1, 79, 1, 79, 1, 79, 1, 79, 1, 79, 1, 79, 1, 79, 1, 79, 1, 79, 1, 80, 1, 80, 1, 80, 1, 80, 1, 80, 1, 80, 1, 80, 1, 80, 1, 80, 1, 81, 1, 81, 1, 81, 1, 81, 1, 81, 1, 81, 1, 81, 1, 81, 1, 81, 1, 81, 1, 81, 1, 81, 1, 81, 1, 82, 1, 82, 1, 82, 1, 82, 1, 82, 1, 82, 1, 82, 1, 82, 1, 82, 1, 82, 1, 83, 1, 83, 1, 83, 1, 83, 1, 83, 1, 83, 1, 83, 1, 83, 1, 83, 1, 83, 1, 84, 1, 84, 1, 84, 1, 85, 1, 85, 1, 85, 1, 85, 1, 86, 1, 86, 1, 86, 1, 86, 1, 86, 1, 87, 1, 87, 1, 87, 1, 88, 1, 88, 1, 88, 1, 89, 1, 89, 1, 89, 1, 89, 1, 89, 1, 89, 1, 89, 1, 89, 1, 90, 1, 90, 1, 90, 1, 91, 1, 91, 1, 91, 1, 91, 1, 92, 1, 92, 1, 92, 1, 93, 1, 93, 1, 93, 1, 93, 1, 93, 1, 93, 1, 93, 1, 93, 1, 94, 1, 94, 1, 94, 1, 94, 1, 94, 1, 94, 1, 94, 1, 94, 1, 95, 1, 95, 1, 95, 1, 95, 1, 95, 1, 95, 1, 95, 1, 95, 1, 95, 1, 95, 1, 96, 1, 96, 1, 96, 1, 96, 1, 96, 1, 96, 1, 96, 1, 96, 1, 97, 1, 97, 1, 97, 1, 97, 1, 97, 1, 97, 1, 97, 1, 97, 1, 97, 1, 97, 1, 98, 1, 98, 1, 98, 1, 98, 1, 98, 1, 98, 1, 98, 1, 99, 1, 99, 1, 99, 1, 99, 1, 99, 1, 99, 1, 99, 1, 99, 1, 99, 1, 100, 1, 100, 1, 100, 1, 101, 1, 101, 1, 101, 1, 101, 1, 101, 1, 101, 1, 101, 1, 101, 1, 101, 1, 101, 1, 102, 1, 102, 1, 102, 1, 102, 1, 102, 1, 102, 1, 102, 1, 102, 1, 102, 1, 102, 1, 102, 1, 102, 1, 102, 1, 103, 1, 103, 1, 103, 1, 103, 1, 104, 1, 104, 1, 104, 1, 105, 1, 105, 1, 105, 1, 105, 1, 105, 1, 105, 1, 105, 1, 105, 1, 105, 1, 105, 1, 105, 1, 106, 1, 106, 1, 106, 1, 106, 1, 107, 1, 107, 1, 107, 1, 107, 1, 107, 1, 107, 1, 107, 1, 108, 1, 108, 1, 108, 1, 108, 1, 108, 1, 108, 1, 108, 1, 108, 1, 108, 1, 108, 1, 108, 1, 108, 1, 108, 1, 108, 1, 108, 1, 109, 1, 109, 1, 109, 1, 109, 1, 109, 1, 109, 1, 109, 1, 109, 1, 109, 1, 109, 1, 109, 1, 109, 1, 110, 1, 110, 1, 110, 1, 110, 1, 110, 1, 111, 1, 111, 1, 111, 1, 111, 1, 111, 1, 111, 1, 111, 1, 112, 1, 112, 1, 112, 1, 112, 1, 112, 1, 112, 1, 112, 1, 112, 1, 112, 1, 112, 1, 112, 1, 112, 1, 112, 1, 112, 1, 113, 1, 113, 1, 113, 1, 113, 1, 113, 1, 113, 1, 113, 1, 114, 1, 114, 1, 114, 1, 114, 1, 114, 1, 114, 1, 114, 1, 114, 1, 115, 1, 115, 1, 115, 1, 115, 1, 115, 1, 115, 1, 115, 1, 115, 1, 116, 1, 116, 1, 116, 1, 116, 1, 116, 1, 116, 1, 116, 1, 116, 1, 116, 1, 116, 1, 116, 1, 117, 1, 117, 1, 117, 1, 117, 1, 117, 1, 118, 1, 118, 1, 118, 1, 119, 1, 119, 1, 119, 1, 119, 1, 119, 1, 120, 1, 120, 1, 120, 1, 120, 1, 120, 1, 121, 1, 121, 1, 121, 1, 121, 1, 121, 1, 121, 1, 122, 1, 122, 1, 122, 1, 122, 1, 122, 1, 122, 1, 122, 1, 123, 1, 123, 1, 123, 1, 123, 1, 123, 1, 123, 1, 123, 1, 124, 1, 124, 1, 124, 1, 124, 1, 124, 1, 124, 1, 124, 1, 124, 1, 124, 1, 124, 1, 125, 1, 125, 1, 125, 1, 126, 1, 126, 1, 126, 1, 126, 1, 127, 1, 127, 0, 0, 128, 1, 1, 3, 2, 5, 3, 7, 4, 9, 5, 11, 6, 13, 7, 15, 8, 17, 9, 19, 10, 21, 11, 23, 12, 25, 13, 27, 14, 29, 15, 31, 16, 33, 17, 35, 18, 37, 19, 39, 20, 41, 21, 43, 22, 45, 23, 47, 24, 49, 25, 51, 26, 53, 27, 55, 28, 57, 29, 59, 30, 61, 31, 63, 32, 65, 33, 67, 34, 69, 35, 71, 36, 73, 37, 75, 38, 77, 39, 79, 40, 81, 41, 83, 42, 85, 43, 87, 44, 89, 45, 91, 46, 93, 47, 95, 48, 97, 49, 99, 50, 101, 51, 103, 52, 105, 53, 107, 54, 109, 55, 111, 56, 113, 57, 115, 58, 117, 59, 119, 60, 121, 61, 123, 62, 125, 63, 127, 64, 129, 65, 131, 66, 133, 67, 135, 68, 137, 69, 139, 70, 141, 71, 143, 72, 145, 73, 147, 74, 149, 75, 151, 76, 153, 77, 155, 78, 157, 79, 159, 80, 161, 81, 163, 82, 165, 83, 167, 84, 169, 85, 171, 86, 173, 87, 175, 88, 177, 89, 179, 90, 181, 91, 183, 92, 185, 93, 187, 94, 189, 95, 191, 96, 193, 97, 195, 98, 197, 99, 199, 100, 201, 101, 203, 102, 205, 103, 207, 104, 209, 105, 211, 106, 213, 107, 215, 108, 217, 109, 219, 110, 221, 111, 223, 112, 225, 113, 227, 114, 229, 115, 231, 116, 233, 117, 235, 118, 237, 119, 239, 120, 241, 121, 243, 122, 245, 123, 247, 124, 249, 125, 251, 126, 253, 127, 255, 128, 1, 0, 3, 3, 0, 9, 10, 12, 13, 32, 32, 1, 0, 48, 57, 3, 0, 10, 10, 13, 13, 34, 34, 1109, 0, 1, 1, 0, 0, 0, 0, 3, 1, 0, 0, 0, 0, 5, 1, 0, 0, 0, 0, 7, 1, 0, 0, 0, 0, 9, 1, 0, 0, 0, 0, 11, 1, 0, 0, 0, 0, 13, 1, 0, 0, 0, 0, 15, 1, 0, 0, 0, 0, 17, 1, 0, 0, 0, 0, 19, 1, 0, 0, 0, 0, 21, 1, 0, 0, 0, 0, 23, 1, 0, 0, 0, 0, 25, 1, 0, 0, 0, 0, 27, 1, 0, 0, 0, 0, 29, 1, 0, 0, 0, 0, 31, 1, 0, 0, 0, 0, 33, 1, 0, 0, 0, 0, 35, 1, 0, 0, 0, 0, 37, 1, 0, 0, 0, 0, 39, 1, 0, 0, 0, 0, 41, 1, 0, 0, 0, 0, 43, 1, 0, 0, 0, 0, 45, 1, 0, 0, 0, 0, 47, 1, 0, 0, 0, 0, 49, 1, 0, 0, 0, 0, 51, 1, 0, 0, 0, 0, 53, 1, 0, 0, 0, 0, 55, 1, 0, 0, 0, 0, 57, 1, 0, 0, 0, 0, 59, 1, 0, 0, 0, 0, 61, 1, 0, 0, 0, 0, 63, 1, 0, 0, 0, 0, 65, 1, 0, 0, 0, 0, 67, 1, 0, 0, 0, 0, 69, 1, 0, 0, 0, 0, 71, 1, 0, 0, 0, 0, 73, 1, 0, 0, 0, 0, 75, 1, 0, 0, 0, 0, 77, 1, 0, 0, 0, 0, 79, 1, 0, 0, 0, 0, 81, 1, 0, 0, 0, 0, 83, 1, 0, 0, 0, 0, 85, 1, 0, 0, 0, 0, 87, 1, 0, 0, 0, 0, 89, 1, 0, 0, 0, 0, 91, 1, 0, 0, 0, 0, 93, 1, 0, 0, 0, 0, 95, 1, 0, 0, 0, 0, 97, 1, 0, 0, 0, 0, 99, 1, 0, 0, 0, 0, 101, 1, 0, 0, 0, 0, 103, 1, 0, 0, 0, 0, 105, 1, 0, 0, 0, 0, 107, 1, 0, 0, 0, 0, 109, 1, 0, 0, 0, 0, 111, 1, 0, 0, 0, 0, 113, 1, 0, 0, 0, 0, 115, 1, 0, 0, 0, 0, 117, 1, 0, 0, 0, 0, 119, 1, 0, 0, 0, 0, 121, 1, 0, 0, 0, 0, 123, 1, 0, 0, 0, 0, 125, 1, 0, 0, 0, 0, 127, 1, 0, 0, 0, 0, 129, 1, 0, 0, 0, 0, 131, 1, 0, 0, 0, 0, 133, 1, 0, 0, 0, 0, 135, 1, 0, 0, 0, 0, 137, 1, 0, 0, 0, 0, 139, 1, 0, 0, 0, 0, 141, 1, 0, 0, 0, 0, 143, 1, 0, 0, 0, 0, 145, 1, 0, 0, 0, 0, 147, 1, 0, 0, 0, 0, 149, 1, 0, 0, 0, 0, 151, 1, 0, 0, 0, 0, 153, 1, 0, 0, 0, 0, 155, 1, 0, 0, 0, 0, 157, 1, 0, 0, 0, 0, 159, 1, 0, 0, 0, 0, 161, 1, 0, 0, 0, 0, 163, 1, 0, 0, 0, 0, 165, 1, 0, 0, 0, 0, 167, 1, 0, 0, 0, 0, 169, 1, 0, 0, 0, 0, 171, 1, 0, 0, 0, 0, 173, 1, 0, 0, 0, 0, 175, 1, 0, 0, 0, 0, 177, 1, 0, 0, 0, 0, 179, 1, 0, 0, 0, 0, 181, 1, 0, 0, 0, 0, 183, 1, 0, 0, 0, 0, 185, 1, 0, 0, 0, 0, 187, 1, 0, 0, 0, 0, 189, 1, 0, 0, 0, 0, 191, 1, 0, 0, 0, 0, 193, 1, 0, 0, 0, 0, 195, 1, 0, 0, 0, 0, 197, 1, 0, 0, 0, 0, 199, 1, 0, 0, 0, 0, 201, 1, 0, 0, 0, 0, 203, 1, 0, 0, 0, 0, 205, 1, 0, 0, 0, 0, 207, 1, 0, 0, 0, 0, 209, 1, 0, 0, 0, 0, 211, 1, 0, 0, 0, 0, 213, 1, 0, 0, 0, 0, 215, 1, 0, 0, 0, 0, 217, 1, 0, 0, 0, 0, 219, 1, 0, 0, 0, 0, 221, 1, 0, 0, 0, 0, 223, 1, 0, 0, 0, 0, 225, 1, 0, 0, 0, 0, 227, 1, 0, 0, 0, 0, 229, 1, 0, 0, 0, 0, 231, 1, 0, 0, 0, 0, 233, 1, 0, 0, 0, 0, 235, 1, 0, 0, 0, 0, 237, 1, 0, 0, 0, 0, 239, 1, 0, 0, 0, 0, 241, 1, 0, 0, 0, 0, 243, 1, 0, 0, 0, 0, 245, 1, 0, 0, 0, 0, 247, 1, 0, 0, 0, 0, 249, 1, 0, 0, 0, 0, 251, 1, 0, 0, 0, 0, 253, 1, 0, 0, 0, 0, 255, 1, 0, 0, 0, 1, 257, 1, 0, 0, 0, 3, 259, 1, 0, 0, 0, 5, 262, 1, 0, 0, 0, 7, 264, 1, 0, 0, 0, 9, 266, 1, 0, 0, 0, 11, 269, 1, 0, 0, 0, 13, 273, 1, 0, 0, 0, 15, 275, 1, 0, 0, 0, 17, 277, 1, 0, 0, 0, 19, 279, 1, 0, 0, 0, 21, 281, 1, 0, 0, 0, 23, 283, 1, 0, 0, 0, 25, 286, 1, 0, 0, 0, 27, 291, 1, 0, 0, 0, 29, 299, 1, 0, 0, 0, 31, 302, 1, 0, 0, 0, 33, 307, 1, 0, 0, 0, 35, 317, 1, 0, 0, 0, 37, 328, 1, 0, 0, 0, 39, 334, 1, 0, 0, 0, 41, 343, 1, 0, 0, 0, 43, 346, 1, 0, 0, 0, 45, 352, 1, 0, 0, 0, 47, 356, 1, 0, 0, 0, 49, 360, 1, 0, 0, 0, 51, 363, 1, 0, 0, 0, 53, 370, 1, 0, 0, 0, 55, 376, 1, 0, 0, 0, 57, 385, 1, 0, 0, 0, 59, 393, 1, 0, 0, 0, 61, 398, 1, 0, 0, 0, 63, 401, 1, 0, 0, 0, 65, 408, 1, 0, 0, 0, 67, 414, 1, 0, 0, 0, 69, 425, 1, 0, 0, 0, 71, 433, 1, 0, 0, 0, 73, 443, 1, 0, 0, 0, 75, 453, 1, 0, 0, 0, 77, 464, 1, 0, 0, 0, 79, 476, 1, 0, 0, 0, 81, 486, 1, 0, 0, 0, 83, 495, 1, 0, 0, 0, 85, 503, 1, 0, 0, 0, 87, 514, 1, 0, 0, 0, 89, 522, 1, 0, 0, 0, 91, 525, 1, 0, 0, 0, 93, 537, 1, 0, 0, 0, 95, 548, 1, 0, 0, 0, 97, 557, 1, 0, 0, 0, 99, 561, 1, 0, 0, 0, 101, 566, 1, 0, 0, 0, 103, 570, 1, 0, 0, 0, 105, 573, 1, 0, 0, 0, 107, 578, 1, 0, 0, 0, 109, 584, 1, 0, 0, 0, 111, 592, 1, 0, 0, 0, 113, 601, 1, 0, 0, 0, 115, 611, 1, 0, 0, 0, 117, 618, 1, 0, 0, 0, 119, 624, 1, 0, 0, 0, 121, 629, 1, 0, 0, 0, 123, 633, 1, 0, 0, 0, 125, 638, 1, 0, 0, 0, 127, 647, 1, 0, 0, 0, 129, 655, 1, 0, 0, 0, 131, 658, 1, 0, 0, 0, 133, 669, 1, 0, 0, 0, 135, 677, 1, 0, 0, 0, 137, 684, 1, 0, 0, 0, 139, 687, 1, 0, 0, 0, 141, 690, 1, 0, 0, 0, 143, 696, 1, 0, 0, 0, 145, 699, 1, 0, 0, 0, 147, 711, 1, 0, 0, 0, 149, 715, 1, 0, 0, 0, 151, 723, 1, 0, 0, 0, 153, 733, 1, 0, 0, 0, 155, 740, 1, 0, 0, 0, 157, 749, 1, 0, 0, 0, 159, 756, 1, 0, 0, 0, 161, 766, 1, 0, 0, 0, 163, 775, 1, 0, 0, 0, 165, 788, 1, 0, 0, 0, 167, 798, 1, 0, 0, 0, 169, 808, 1, 0, 0, 0, 171, 811, 1, 0, 0, 0, 173, 815, 1, 0, 0, 0, 175, 820, 1, 0, 0, 0, 177, 823, 1, 0, 0, 0, 179, 826, 1, 0, 0, 0, 181, 834, 1, 0, 0, 0, 183, 837, 1, 0, 0, 0, 185, 841, 1, 0, 0, 0, 187, 844, 1, 0, 0, 0, 189, 852, 1, 0, 0, 0, 191, 860, 1, 0, 0, 0, 193, 870, 1, 0, 0, 0, 195, 878, 1, 0, 0, 0, 197, 888, 1, 0, 0, 0, 199, 895, 1, 0, 0, 0, 201, 904, 1, 0, 0, 0, 203, 907, 1, 0, 0, 0, 205, 917, 1, 0, 0, 0, 207, 930, 1, 0, 0, 0, 209, 934, 1, 0, 0, 0, 211, 937, 1, 0, 0, 0, 213, 948, 1, 0, 0, 0, 215, 952, 1, 0, 0, 0, 217, 959, 1, 0, 0, 0, 219, 974, 1, 0, 0, 0, 221, 986, 1, 0, 0, 0, 223, 991, 1, 0, 0, 0, 225, 998, 1, 0, 0, 0, 227, 1012, 1, 0, 0, 0, 229, 1019, 1, 0, 0, 0, 231, 1027, 1, 0, 0, 0, 233, 1035, 1, 0, 0, 0, 235, 1046, 1, 0, 0, 0, 237, 1051, 1, 0, 0, 0, 239, 1054, 1, 0, 0, 0, 241, 1059, 1, 0, 0, 0, 243, 1064, 1, 0, 0, 0, 245, 1070, 1, 0, 0, 0, 247, 1077, 1, 0, 0, 0, 249, 1084, 1, 0, 0, 0, 251, 1094, 1, 0, 0, 0, 253, 1097, 1, 0, 0, 0, 255, 1101, 1, 0, 0, 0, 257, 258, 5, 91, 0, 0, 258, 2, 1, 0, 0, 0, 259, 260, 5, 46, 0, 0, 260, 261, 5, 46, 0, 0, 261, 4, 1, 0, 0, 0, 262, 263, 5, 93, 0, 0, 263, 6, 1, 0, 0, 0, 264, 265, 5, 42, 0, 0, 265, 8, 1, 0, 0, 0, 266, 267, 5, 58, 0, 0, 267, 268, 5, 62, 0, 0, 268, 10, 1, 0, 0, 0, 269, 270, 5, 58, 0, 0, 270, 271, 5, 62, 0, 0, 271, 272, 5, 62, 0, 0, 272, 12, 1, 0, 0, 0, 273, 274, 5, 58, 0, 0, 274, 14, 1, 0, 0, 0, 275, 276, 5, 61, 0, 0, 276, 16, 1, 0, 0, 0, 277, 278, 5, 124, 0, 0, 278, 18, 1, 0, 0, 0, 279, 280, 5, 47, 0, 0, 280, 20, 1, 0, 0, 0, 281, 282, 5, 44, 0, 0, 282, 22, 1, 0, 0, 0, 283, 284, 5, 58, 0, 0, 284, 285, 5, 58, 0, 0, 285, 24, 1, 0, 0, 0, 286, 287, 5, 58, 0, 0, 287, 288, 5, 58, 0, 0, 288, 289, 5, 62, 0, 0, 289, 26, 1, 0, 0, 0, 290, 292, 7, 0, 0, 0, 291, 290, 1, 0, 0, 0, 292, 293, 1, 0, 0, 0, 293, 291, 1, 0, 0, 0, 293, 294, 1, 0, 0, 0, 294, 295, 1, 0, 0, 0, 295, 296, 6, 13, 0, 0, 296, 28, 1, 0, 0, 0, 297, 300, 3, 239, 119, 0, 298, 300, 3, 107, 53, 0, 299, 297, 1, 0, 0, 0, 299, 298, 1, 0, 0, 0, 300, 30, 1, 0, 0, 0, 301, 303, 7, 1, 0, 0, 302, 301, 1, 0, 0, 0, 303, 304, 1, 0, 0, 0, 304, 302, 1, 0, 0, 0, 304, 305, 1, 0, 0, 0, 305, 32, 1, 0, 0, 0, 306, 308, 7, 1, 0, 0, 307, 306, 1, 0, 0, 0, 308, 309, 1, 0, 0, 0, 309, 307, 1, 0, 0, 0, 309, 310, 1, 0, 0, 0, 310, 311, 1, 0, 0, 0, 311, 313, 5, 46, 0, 0, 312, 314, 7, 1, 0, 0, 313, 312, 1, 0, 0, 0, 314, 315, 1, 0, 0, 0, 315, 313, 1, 0, 0, 0, 315, 316, 1, 0, 0, 0, 316, 34, 1, 0, 0, 0, 317, 323, 5, 34, 0, 0, 318, 322, 8, 2, 0, 0, 319, 320, 5, 34, 0, 0, 320, 322, 5, 34, 0, 0, 321, 318, 1, 0, 0, 0, 321, 319, 1, 0, 0, 0, 322, 325, 1, 0, 0, 0, 323, 321, 1, 0, 0, 0, 323, 324, 1, 0, 0, 0, 324, 326, 1, 0, 0, 0, 325, 323, 1, 0, 0, 0, 326, 327, 5, 34, 0, 0, 327, 36, 1, 0, 0, 0, 328, 329, 5, 97, 0, 0, 329, 330, 5, 98, 0, 0, 330, 331, 5, 111, 0, 0, 331, 332, 5, 117, 0, 0, 332, 333, 5, 116, 0, 0, 333, 38, 1, 0, 0, 0, 334, 335, 5, 97, 0, 0, 335, 336, 5, 98, 0, 0, 336, 337, 5, 115, 0, 0, 337, 338, 5, 116, 0, 0, 338, 339, 5, 114, 0, 0, 339, 340, 5, 97, 0, 0, 340, 341, 5, 99, 0, 0, 341, 342, 5, 116, 0, 0, 342, 40, 1, 0, 0, 0, 343, 344, 3, 39, 19, 0, 344, 345, 3, 27, 13, 0, 345, 42, 1, 0, 0, 0, 346, 347, 5, 97, 0, 0, 347, 348, 5, 108, 0, 0, 348, 349, 5, 105, 0, 0, 349, 350, 5, 97, 0, 0, 350, 351, 5, 115, 0, 0, 351, 44, 1, 0, 0, 0, 352, 353, 5, 97, 0, 0, 353, 354, 5, 108, 0, 0, 354, 355, 5, 108, 0, 0, 355, 46, 1, 0, 0, 0, 356, 357, 5, 97, 0, 0, 357, 358, 5, 110, 0, 0, 358, 359, 5, 100, 0, 0, 359, 48, 1, 0, 0, 0, 360, 361, 5, 97, 0, 0, 361, 362, 5, 115, 0, 0, 362, 50, 1, 0, 0, 0, 363, 364, 5, 97, 0, 0, 364, 365, 5, 115, 0, 0, 365, 366, 5, 115, 0, 0, 366, 367, 5, 105, 0, 0, 367, 368, 5, 103, 0, 0, 368, 369, 5, 110, 0, 0, 369, 52, 1, 0, 0, 0, 370, 371, 5, 97, 0, 0, 371, 372, 5, 115, 0, 0, 372, 373, 5, 115, 0, 0, 373, 374, 5, 111, 0, 0, 374, 375, 5, 99, 0, 0, 375, 54, 1, 0, 0, 0, 376, 377, 5, 98, 0, 0, 377, 378, 5, 101, 0, 0, 378, 379, 5, 104, 0, 0, 379, 380, 5, 97, 0, 0, 380, 381, 5, 118, 0, 0, 381, 382, 5, 105, 0, 0, 382, 383, 5, 111, 0, 0, 383, 384, 5, 114, 0, 0, 384, 56, 1, 0, 0, 0, 385, 386, 5, 98, 0, 0, 386, 387, 5, 105, 0, 0, 387, 388, 5, 110, 0, 0, 388, 389, 5, 100, 0, 0, 389, 390, 5, 105, 0, 0, 390, 391, 5, 110, 0, 0, 391, 392, 5, 103, 0, 0, 392, 58, 1, 0, 0, 0, 393, 394, 5, 98, 0, 0, 394, 395, 5, 111, 0, 0, 395, 396, 5, 111, 0, 0, 396, 397, 5, 108, 0, 0, 397, 60, 1, 0, 0, 0, 398, 399, 5, 98, 0, 0, 399, 400, 5, 121, 0, 0, 400, 62, 1, 0, 0, 0, 401, 402, 5, 99, 0, 0, 402, 403, 5, 104, 0, 0, 403, 404, 5, 97, 0, 0, 404, 405, 5, 105, 0, 0, 405, 406, 5, 110, 0, 0, 406, 407, 5, 115, 0, 0, 407, 64, 1, 0, 0, 0, 408, 409, 5, 99, 0, 0, 409, 410, 5, 108, 0, 0, 410, 411, 5, 97, 0, 0, 411, 412, 5, 115, 0, 0, 412, 413, 5, 115, 0, 0, 413, 66, 1, 0, 0, 0, 414, 415, 5, 99, 0, 0, 415, 416, 5, 108, 0, 0, 416, 417, 5, 97, 0, 0, 417, 418, 5, 115, 0, 0, 418, 419, 5, 115, 0, 0, 419, 420, 5, 105, 0, 0, 420, 421, 5, 102, 0, 0, 421, 422, 5, 105, 0, 0, 422, 423, 5, 101, 0, 0, 423, 424, 5, 114, 0, 0, 424, 68, 1, 0, 0, 0, 425, 426, 5, 99, 0, 0, 426, 427, 5, 111, 0, 0, 427, 428, 5, 109, 0, 0, 428, 429, 5, 109, 0, 0, 429, 430, 5, 101, 0, 0, 430, 431, 5, 110, 0, 0, 431, 432, 5, 116, 0, 0, 432, 70, 1, 0, 0, 0, 433, 434, 5, 99, 0, 0, 434, 435, 5, 111, 0, 0, 435, 436, 5, 109, 0, 0, 436, 437, 5, 112, 0, 0, 437, 438, 5, 111, 0, 0, 438, 439, 5, 115, 0, 0, 439, 440, 5, 105, 0, 0, 440, 441, 5, 116, 0, 0, 441, 442, 5, 101, 0, 0, 442, 72, 1, 0, 0, 0, 443, 444, 5, 99, 0, 0, 444, 445, 5, 111, 0, 0, 445, 446, 5, 110, 0, 0, 446, 447, 5, 106, 0, 0, 447, 448, 5, 117, 0, 0, 448, 449, 5, 103, 0, 0, 449, 450, 5, 97, 0, 0, 450, 451, 5, 116, 0, 0, 451, 452, 5, 101, 0, 0, 452, 74, 1, 0, 0, 0, 453, 454, 5, 99, 0, 0, 454, 455, 5, 111, 0, 0, 455, 456, 5, 110, 0, 0, 456, 457, 5, 106, 0, 0, 457, 458, 5, 117, 0, 0, 458, 459, 5, 103, 0, 0, 459, 460, 5, 97, 0, 0, 460, 461, 5, 116, 0, 0, 461, 462, 5, 101, 0, 0, 462, 463, 5, 115, 0, 0, 463, 76, 1, 0, 0, 0, 464, 465, 5, 99, 0, 0, 465, 466, 5, 111, 0, 0, 466, 467, 5, 110, 0, 0, 467, 468, 5, 106, 0, 0, 468, 469, 5, 117, 0, 0, 469, 470, 5, 103, 0, 0, 470, 471, 5, 97, 0, 0, 471, 472, 5, 116, 0, 0, 472, 473, 5, 105, 0, 0, 473, 474, 5, 111, 0, 0, 474, 475, 5, 110, 0, 0, 475, 78, 1, 0, 0, 0, 476, 477, 5, 99, 0, 0, 477, 478, 5, 111, 0, 0, 478, 479, 5, 110, 0, 0, 479, 480, 5, 110, 0, 0, 480, 481, 5, 101, 0, 0, 481, 482, 5, 99, 0, 0, 482, 483, 5, 116, 0, 0, 483, 484, 5, 111, 0, 0, 484, 485, 5, 114, 0, 0, 485, 80, 1, 0, 0, 0, 486, 487, 5, 100, 0, 0, 487, 488, 5, 97, 0, 0, 488, 489, 5, 116, 0, 0, 489, 490, 5, 97, 0, 0, 490, 491, 5, 116, 0, 0, 491, 492, 5, 121, 0, 0, 492, 493, 5, 112, 0, 0, 493, 494, 5, 101, 0, 0, 494, 82, 1, 0, 0, 0, 495, 496, 5, 100, 0, 0, 496, 497, 5, 101, 0, 0, 497, 498, 5, 102, 0, 0, 498, 499, 5, 97, 0, 0, 499, 500, 5, 117, 0, 0, 500, 501, 5, 108, 0, 0, 501, 502, 5, 116, 0, 0, 502, 84, 1, 0, 0, 0, 503, 504, 5, 100, 0, 0, 504, 505, 5, 101, 0, 0, 505, 506, 5, 112, 0, 0, 506, 507, 5, 101, 0, 0, 507, 508, 5, 110, 0, 0, 508, 509, 5, 100, 0, 0, 509, 510, 5, 101, 0, 0, 510, 511, 5, 110, 0, 0, 511, 512, 5, 99, 0, 0, 512, 513, 5, 121, 0, 0, 513, 86, 1, 0, 0, 0, 514, 515, 5, 100, 0, 0, 515, 516, 5, 101, 0, 0, 516, 517, 5, 114, 0, 0, 517, 518, 5, 105, 0, 0, 518, 519, 5, 118, 0, 0, 519, 520, 5, 101, 0, 0, 520, 521, 5, 100, 0, 0, 521, 88, 1, 0, 0, 0, 522, 523, 3, 87, 43, 0, 523, 524, 3, 27, 13, 0, 524, 90, 1, 0, 0, 0, 525, 526, 5, 100, 0, 0, 526, 527, 5, 105, 0, 0, 527, 528, 5, 102, 0, 0, 528, 529, 5, 102, 0, 0, 529, 530, 5, 101, 0, 0, 530, 531, 5, 114, 0, 0, 531, 532, 5, 101, 0, 0, 532, 533, 5, 110, 0, 0, 533, 534, 5, 99, 0, 0, 534, 535, 5, 101, 0, 0, 535, 536, 5, 115, 0, 0, 536, 92, 1, 0, 0, 0, 537, 538, 5, 100, 0, 0, 538, 539, 5, 105, 0, 0, 539, 540, 5, 115, 0, 0, 540, 541, 5, 106, 0, 0, 541, 542, 5, 111, 0, 0, 542, 543, 5, 105, 0, 0, 543, 544, 5, 110, 0, 0, 544, 545, 5, 105, 0, 0, 545, 546, 5, 110, 0, 0, 546, 547, 5, 103, 0, 0, 547, 94, 1, 0, 0, 0, 548, 549, 5, 100, 0, 0, 549, 550, 5, 105, 0, 0, 550, 551, 5, 115, 0, 0, 551, 552, 5, 106, 0, 0, 552, 553, 5, 111, 0, 0, 553, 554, 5, 105, 0, 0, 554, 555, 5, 110, 0, 0, 555, 556, 5, 116, 0, 0, 556, 96, 1, 0, 0, 0, 557, 558, 5, 100, 0, 0, 558, 559, 5, 111, 0, 0, 559, 560, 5, 99, 0, 0, 560, 98, 1, 0, 0, 0, 561, 562, 5, 101, 0, 0, 562, 563, 5, 108, 0, 0, 563, 564, 5, 115, 0, 0, 564, 565, 5, 101, 0, 0, 565, 100, 1, 0, 0, 0, 566, 567, 5, 101, 0, 0, 567, 568, 5, 110, 0, 0, 568, 569, 5, 100, 0, 0, 569, 102, 1, 0, 0, 0, 570, 571, 3, 101, 50, 0, 571, 572, 3, 27, 13, 0, 572, 104, 1, 0, 0, 0, 573, 574, 5, 101, 0, 0, 574, 575, 5, 120, 0, 0, 575, 576, 5, 112, 0, 0, 576, 577, 5, 114, 0, 0, 577, 106, 1, 0, 0, 0, 578, 579, 5, 102, 0, 0, 579, 580, 5, 97, 0, 0, 580, 581, 5, 108, 0, 0, 581, 582, 5, 115, 0, 0, 582, 583, 5, 101, 0, 0, 583, 108, 1, 0, 0, 0, 584, 585, 5, 102, 0, 0, 585, 586, 5, 101, 0, 0, 586, 587, 5, 97, 0, 0, 587, 588, 5, 116, 0, 0, 588, 589, 5, 117, 0, 0, 589, 590, 5, 114, 0, 0, 590, 591, 5, 101, 0, 0, 591, 110, 1, 0, 0, 0, 592, 593, 5, 102, 0, 0, 593, 594, 5, 101, 0, 0, 594, 595, 5, 97, 0, 0, 595, 596, 5, 116, 0, 0, 596, 597, 5, 117, 0, 0, 597, 598, 5, 114, 0, 0, 598, 599, 5, 101, 0, 0, 599, 600, 5, 100, 0, 0, 600, 112, 1, 0, 0, 0, 601, 602, 5, 102, 0, 0, 602, 603, 5, 101, 0, 0, 603, 604, 5, 97, 0, 0, 604, 605, 5, 116, 0, 0, 605, 606, 5, 117, 0, 0, 606, 607, 5, 114, 0, 0, 607, 608, 5, 105, 0, 0, 608, 609, 5, 110, 0, 0, 609, 610, 5, 103, 0, 0, 610, 114, 1, 0, 0, 0, 611, 612, 5, 102, 0, 0, 612, 613, 5, 105, 0, 0, 613, 614, 5, 108, 0, 0, 614, 615, 5, 116, 0, 0, 615, 616, 5, 101, 0, 0, 616, 617, 5, 114, 0, 0, 617, 116, 1, 0, 0, 0, 618, 619, 5, 102, 0, 0, 619, 620, 5, 105, 0, 0, 620, 621, 5, 114, 0, 0, 621, 622, 5, 115, 0, 0, 622, 623, 5, 116, 0, 0, 623, 118, 1, 0, 0, 0, 624, 625, 5, 102, 0, 0, 625, 626, 5, 108, 0, 0, 626, 627, 5, 111, 0, 0, 627, 628, 5, 119, 0, 0, 628, 120, 1, 0, 0, 0, 629, 630, 5, 102, 0, 0, 630, 631, 5, 111, 0, 0, 631, 632, 5, 114, 0, 0, 632, 122, 1, 0, 0, 0, 633, 634, 5, 102, 0, 0, 634, 635, 5, 114, 0, 0, 635, 636, 5, 111, 0, 0, 636, 637, 5, 109, 0, 0, 637, 124, 1, 0, 0, 0, 638, 639, 5, 102, 0, 0, 639, 640, 5, 117, 0, 0, 640, 641, 5, 110, 0, 0, 641, 642, 5, 99, 0, 0, 642, 643, 5, 116, 0, 0, 643, 644, 5, 105, 0, 0, 644, 645, 5, 111, 0, 0, 645, 646, 5, 110, 0, 0, 646, 126, 1, 0, 0, 0, 647, 648, 5, 104, 0, 0, 648, 649, 5, 97, 0, 0, 649, 650, 5, 115, 0, 0, 650, 651, 5, 116, 0, 0, 651, 652, 5, 121, 0, 0, 652, 653, 5, 112, 0, 0, 653, 654, 5, 101, 0, 0, 654, 128, 1, 0, 0, 0, 655, 656, 5, 105, 0, 0, 656, 657, 5, 102, 0, 0, 657, 130, 1, 0, 0, 0, 658, 659, 5, 105, 0, 0, 659, 660, 5, 110, 0, 0, 660, 661, 5, 116, 0, 0, 661, 662, 5, 101, 0, 0, 662, 663, 5, 114, 0, 0, 663, 664, 5, 115, 0, 0, 664, 665, 5, 101, 0, 0, 665, 666, 5, 99, 0, 0, 666, 667, 5, 116, 0, 0, 667, 668, 5, 115, 0, 0, 668, 132, 1, 0, 0, 0, 669, 670, 5, 105, 0, 0, 670, 671, 5, 109, 0, 0, 671, 672, 5, 112, 0, 0, 672, 673, 5, 108, 0, 0, 673, 674, 5, 105, 0, 0, 674, 675, 5, 101, 0, 0, 675, 676, 5, 115, 0, 0, 676, 134, 1, 0, 0, 0, 677, 678, 5, 105, 0, 0, 678, 679, 5, 109, 0, 0, 679, 680, 5, 112, 0, 0, 680, 681, 5, 111, 0, 0, 681, 682, 5, 114, 0, 0, 682, 683, 5, 116, 0, 0, 683, 136, 1, 0, 0, 0, 684, 685, 5, 105, 0, 0, 685, 686, 5, 110, 0, 0, 686, 138, 1, 0, 0, 0, 687, 688, 3, 137, 68, 0, 688, 689, 3, 27, 13, 0, 689, 140, 1, 0, 0, 0, 690, 691, 5, 105, 0, 0, 691, 692, 5, 110, 0, 0, 692, 693, 5, 111, 0, 0, 693, 694, 5, 117, 0, 0, 694, 695, 5, 116, 0, 0, 695, 142, 1, 0, 0, 0, 696, 697, 3, 141, 70, 0, 697, 698, 3, 27, 13, 0, 698, 144, 1, 0, 0, 0, 699, 700, 5, 105, 0, 0, 700, 701, 5, 110, 0, 0, 701, 702, 5, 116, 0, 0, 702, 703, 5, 101, 0, 0, 703, 704, 5, 114, 0, 0, 704, 705, 5, 97, 0, 0, 705, 706, 5, 99, 0, 0, 706, 707, 5, 116, 0, 0, 707, 708, 5, 105, 0, 0, 708, 709, 5, 111, 0, 0, 709, 710, 5, 110, 0, 0, 710, 146, 1, 0, 0, 0, 711, 712, 5, 105, 0, 0, 712, 713, 5, 110, 0, 0, 713, 714, 5, 118, 0, 0, 714, 148, 1, 0, 0, 0, 715, 716, 5, 105, 0, 0, 716, 717, 5, 110, 0, 0, 717, 718, 5, 118, 0, 0, 718, 719, 5, 101, 0, 0, 719, 720, 5, 114, 0, 0, 720, 721, 5, 115, 0, 0, 721, 722, 5, 101, 0, 0, 722, 150, 1, 0, 0, 0, 723, 724, 5, 105, 0, 0, 724, 725, 5, 110, 0, 0, 725, 726, 5, 118, 0, 0, 726, 727, 5, 101, 0, 0, 727, 728, 5, 114, 0, 0, 728, 729, 5, 116, 0, 0, 729, 730, 5, 105, 0, 0, 730, 731, 5, 110, 0, 0, 731, 732, 5, 103, 0, 0, 732, 152, 1, 0, 0, 0, 733, 734, 5, 105, 0, 0, 734, 735, 5, 115, 0, 0, 735, 736, 5, 116, 0, 0, 736, 737, 5, 121, 0, 0, 737, 738, 5, 112, 0, 0, 738, 739, 5, 101, 0, 0, 739, 154, 1, 0, 0, 0, 740, 741, 5, 108, 0, 0, 741, 742, 5, 97, 0, 0, 742, 743, 5, 110, 0, 0, 743, 744, 5, 103, 0, 0, 744, 745, 5, 117, 0, 0, 745, 746, 5, 97, 0, 0, 746, 747, 5, 103, 0, 0, 747, 748, 5, 101, 0, 0, 748, 156, 1, 0, 0, 0, 749, 750, 5, 109, 0, 0, 750, 751, 5, 101, 0, 0, 751, 752, 5, 109, 0, 0, 752, 753, 5, 98, 0, 0, 753, 754, 5, 101, 0, 0, 754, 755, 5, 114, 0, 0, 755, 158, 1, 0, 0, 0, 756, 757, 5, 109, 0, 0, 757, 758, 5, 101, 0, 0, 758, 759, 5, 116, 0, 0, 759, 760, 5, 97, 0, 0, 760, 761, 5, 99, 0, 0, 761, 762, 5, 108, 0, 0, 762, 763, 5, 97, 0, 0, 763, 764, 5, 115, 0, 0, 764, 765, 5, 115, 0, 0, 765, 160, 1, 0, 0, 0, 766, 767, 5, 109, 0, 0, 767, 768, 5, 101, 0, 0, 768, 769, 5, 116, 0, 0, 769, 770, 5, 97, 0, 0, 770, 771, 5, 100, 0, 0, 771, 772, 5, 97, 0, 0, 772, 773, 5, 116, 0, 0, 773, 774, 5, 97, 0, 0, 774, 162, 1, 0, 0, 0, 775, 776, 5, 109, 0, 0, 776, 777, 5, 117, 0, 0, 777, 778, 5, 108, 0, 0, 778, 779, 5, 116, 0, 0, 779, 780, 5, 105, 0, 0, 780, 781, 5, 112, 0, 0, 781, 782, 5, 108, 0, 0, 782, 783, 5, 105, 0, 0, 783, 784, 5, 99, 0, 0, 784, 785, 5, 105, 0, 0, 785, 786, 5, 116, 0, 0, 786, 787, 5, 121, 0, 0, 787, 164, 1, 0, 0, 0, 788, 789, 5, 110, 0, 0, 789, 790, 5, 97, 0, 0, 790, 791, 5, 109, 0, 0, 791, 792, 5, 101, 0, 0, 792, 793, 5, 115, 0, 0, 793, 794, 5, 112, 0, 0, 794, 795, 5, 97, 0, 0, 795, 796, 5, 99, 0, 0, 796, 797, 5, 101, 0, 0, 797, 166, 1, 0, 0, 0, 798, 799, 5, 110, 0, 0, 799, 800, 5, 111, 0, 0, 800, 801, 5, 110, 0, 0, 801, 802, 5, 117, 0, 0, 802, 803, 5, 110, 0, 0, 803, 804, 5, 105, 0, 0, 804, 805, 5, 113, 0, 0, 805, 806, 5, 117, 0, 0, 806, 807, 5, 101, 0, 0, 807, 168, 1, 0, 0, 0, 808, 809, 3, 27, 13, 0, 809, 810, 3, 167, 83, 0, 810, 170, 1, 0, 0, 0, 811, 812, 5, 110, 0, 0, 812, 813, 5, 111, 0, 0, 813, 814, 5, 116, 0, 0, 814, 172, 1, 0, 0, 0, 815, 816, 5, 110, 0, 0, 816, 817, 5, 117, 0, 0, 817, 818, 5, 108, 0, 0, 818, 819, 5, 108, 0, 0, 819, 174, 1, 0, 0, 0, 820, 821, 5, 111, 0, 0, 821, 822, 5, 102, 0, 0, 822, 176, 1, 0, 0, 0, 823, 824, 5, 111, 0, 0, 824, 825, 5, 114, 0, 0, 825, 178, 1, 0, 0, 0, 826, 827, 5, 111, 0, 0, 827, 828, 5, 114, 0, 0, 828, 829, 5, 100, 0, 0, 829, 830, 5, 101, 0, 0, 830, 831, 5, 114, 0, 0, 831, 832, 5, 101, 0, 0, 832, 833, 5, 100, 0, 0, 833, 180, 1, 0, 0, 0, 834, 835, 3, 27, 13, 0, 835, 836, 3, 179, 89, 0, 836, 182, 1, 0, 0, 0, 837, 838, 5, 111, 0, 0, 838, 839, 5, 117, 0, 0, 839, 840, 5, 116, 0, 0, 840, 184, 1, 0, 0, 0, 841, 842, 3, 183, 91, 0, 842, 843, 3, 27, 13, 0, 843, 186, 1, 0, 0, 0, 844, 845, 5, 112, 0, 0, 845, 846, 5, 97, 0, 0, 846, 847, 5, 99, 0, 0, 847, 848, 5, 107, 0, 0, 848, 849, 5, 97, 0, 0, 849, 850, 5, 103, 0, 0, 850, 851, 5, 101, 0, 0, 851, 188, 1, 0, 0, 0, 852, 853, 5, 112, 0, 0, 853, 854, 5, 111, 0, 0, 854, 855, 5, 114, 0, 0, 855, 856, 5, 116, 0, 0, 856, 857, 5, 105, 0, 0, 857, 858, 5, 111, 0, 0, 858, 859, 5, 110, 0, 0, 859, 190, 1, 0, 0, 0, 860, 861, 5, 112, 0, 0, 861, 862, 5, 114, 0, 0, 862, 863, 5, 101, 0, 0, 863, 864, 5, 100, 0, 0, 864, 865, 5, 105, 0, 0, 865, 866, 5, 99, 0, 0, 866, 867, 5, 97, 0, 0, 867, 868, 5, 116, 0, 0, 868, 869, 5, 101, 0, 0, 869, 192, 1, 0, 0, 0, 870, 871, 5, 112, 0, 0, 871, 872, 5, 114, 0, 0, 872, 873, 5, 105, 0, 0, 873, 874, 5, 118, 0, 0, 874, 875, 5, 97, 0, 0, 875, 876, 5, 116, 0, 0, 876, 877, 5, 101, 0, 0, 877, 194, 1, 0, 0, 0, 878, 879, 5, 112, 0, 0, 879, 880, 5, 114, 0, 0, 880, 881, 5, 111, 0, 0, 881, 882, 5, 116, 0, 0, 882, 883, 5, 101, 0, 0, 883, 884, 5, 99, 0, 0, 884, 885, 5, 116, 0, 0, 885, 886, 5, 101, 0, 0, 886, 887, 5, 100, 0, 0, 887, 196, 1, 0, 0, 0, 888, 889, 5, 112, 0, 0, 889, 890, 5, 117, 0, 0, 890, 891, 5, 98, 0, 0, 891, 892, 5, 108, 0, 0, 892, 893, 5, 105, 0, 0, 893, 894, 5, 99, 0, 0, 894, 198, 1, 0, 0, 0, 895, 896, 5, 114, 0, 0, 896, 897, 5, 101, 0, 0, 897, 898, 5, 97, 0, 0, 898, 899, 5, 100, 0, 0, 899, 900, 5, 111, 0, 0, 900, 901, 5, 110, 0, 0, 901, 902, 5, 108, 0, 0, 902, 903, 5, 121, 0, 0, 903, 200, 1, 0, 0, 0, 904, 905, 3, 199, 99, 0, 905, 906, 3, 27, 13, 0, 906, 202, 1, 0, 0, 0, 907, 908, 5, 114, 0, 0, 908, 909, 5, 101, 0, 0, 909, 910, 5, 100, 0, 0, 910, 911, 5, 101, 0, 0, 911, 912, 5, 102, 0, 0, 912, 913, 5, 105, 0, 0, 913, 914, 5, 110, 0, 0, 914, 915, 5, 101, 0, 0, 915, 916, 5, 115, 0, 0, 916, 204, 1, 0, 0, 0, 917, 918, 5, 114, 0, 0, 918, 919, 5, 101, 0, 0, 919, 920, 5, 100, 0, 0, 920, 921, 5, 101, 0, 0, 921, 922, 5, 102, 0, 0, 922, 923, 5, 105, 0, 0, 923, 924, 5, 110, 0, 0, 924, 925, 5, 105, 0, 0, 925, 926, 5, 116, 0, 0, 926, 927, 5, 105, 0, 0, 927, 928, 5, 111, 0, 0, 928, 929, 5, 110, 0, 0, 929, 206, 1, 0, 0, 0, 930, 931, 5, 114, 0, 0, 931, 932, 5, 101, 0, 0, 932, 933, 5, 102, 0, 0, 933, 208, 1, 0, 0, 0, 934, 935, 3, 207, 103, 0, 935, 936, 3, 27, 13, 0, 936, 210, 1, 0, 0, 0, 937, 938, 5, 114, 0, 0, 938, 939, 5, 101, 0, 0, 939, 940, 5, 102, 0, 0, 940, 941, 5, 101, 0, 0, 941, 942, 5, 114, 0, 0, 942, 943, 5, 101, 0, 0, 943, 944, 5, 110, 0, 0, 944, 945, 5, 99, 0, 0, 945, 946, 5, 101, 0, 0, 946, 947, 5, 115, 0, 0, 947, 212, 1, 0, 0, 0, 948, 949, 5, 114, 0, 0, 949, 950, 5, 101, 0, 0, 950, 951, 5, 112, 0, 0, 951, 214, 1, 0, 0, 0, 952, 953, 5, 114, 0, 0, 953, 954, 5, 101, 0, 0, 954, 955, 5, 116, 0, 0, 955, 956, 5, 117, 0, 0, 956, 957, 5, 114, 0, 0, 957, 958, 5, 110, 0, 0, 958, 216, 1, 0, 0, 0, 959, 960, 5, 115, 0, 0, 960, 961, 5, 112, 0, 0, 961, 962, 5, 101, 0, 0, 962, 963, 5, 99, 0, 0, 963, 964, 5, 105, 0, 0, 964, 965, 5, 97, 0, 0, 965, 966, 5, 108, 0, 0, 966, 967, 5, 105, 0, 0, 967, 968, 5, 122, 0, 0, 968, 969, 5, 97, 0, 0, 969, 970, 5, 116, 0, 0, 970, 971, 5, 105, 0, 0, 971, 972, 5, 111, 0, 0, 972, 973, 5, 110, 0, 0, 973, 218, 1, 0, 0, 0, 974, 975, 5, 115, 0, 0, 975, 976, 5, 112, 0, 0, 976, 977, 5, 101, 0, 0, 977, 978, 5, 99, 0, 0, 978, 979, 5, 105, 0, 0, 979, 980, 5, 97, 0, 0, 980, 981, 5, 108, 0, 0, 981, 982, 5, 105, 0, 0, 982, 983, 5, 122, 0, 0, 983, 984, 5, 101, 0, 0, 984, 985, 5, 115, 0, 0, 985, 220, 1, 0, 0, 0, 986, 987, 5, 115, 0, 0, 987, 988, 5, 116, 0, 0, 988, 989, 5, 101, 0, 0, 989, 990, 5, 112, 0, 0, 990, 222, 1, 0, 0, 0, 991, 992, 5, 115, 0, 0, 992, 993, 5, 116, 0, 0, 993, 994, 5, 114, 0, 0, 994, 995, 5, 117, 0, 0, 995, 996, 5, 99, 0, 0, 996, 997, 5, 116, 0, 0, 997, 224, 1, 0, 0, 0, 998, 999, 5, 115, 0, 0, 999, 1000, 5, 117, 0, 0, 1000, 1001, 5, 98, 0, 0, 1001, 1002, 5, 99, 0, 0, 1002, 1003, 5, 108, 0, 0, 1003, 1004, 5, 97, 0, 0, 1004, 1005, 5, 115, 0, 0, 1005, 1006, 5, 115, 0, 0, 1006, 1007, 5, 105, 0, 0, 1007, 1008, 5, 102, 0, 0, 1008, 1009, 5, 105, 0, 0, 1009, 1010, 5, 101, 0, 0, 1010, 1011, 5, 114, 0, 0, 1011, 226, 1, 0, 0, 0, 1012, 1013, 5, 115, 0, 0, 1013, 1014, 5, 117, 0, 0, 1014, 1015, 5, 98, 0, 0, 1015, 1016, 5, 115, 0, 0, 1016, 1017, 5, 101, 0, 0, 1017, 1018, 5, 116, 0, 0, 1018, 228, 1, 0, 0, 0, 1019, 1020, 5, 115, 0, 0, 1020, 1021, 5, 117, 0, 0, 1021, 1022, 5, 98, 0, 0, 1022, 1023, 5, 115, 0, 0, 1023, 1024, 5, 101, 0, 0, 1024, 1025, 5, 116, 0, 0, 1025, 1026, 5, 115, 0, 0, 1026, 230, 1, 0, 0, 0, 1027, 1028, 5, 115, 0, 0, 1028, 1029, 5, 117, 0, 0, 1029, 1030, 5, 98, 0, 0, 1030, 1031, 5, 116, 0, 0, 1031, 1032, 5, 121, 0, 0, 1032, 1033, 5, 112, 0, 0, 1033, 1034, 5, 101, 0, 0, 1034, 232, 1, 0, 0, 0, 1035, 1036, 5, 115, 0, 0, 1036, 1037, 5, 117, 0, 0, 1037, 1038, 5, 99, 0, 0, 1038, 1039, 5, 99, 0, 0, 1039, 1040, 5, 101, 0, 0, 1040, 1041, 5, 115, 0, 0, 1041, 1042, 5, 115, 0, 0, 1042, 1043, 5, 105, 0, 0, 1043, 1044, 5, 111, 0, 0, 1044, 1045, 5, 110, 0, 0, 1045, 234, 1, 0, 0, 0, 1046, 1047, 5, 116, 0, 0, 1047, 1048, 5, 104, 0, 0, 1048, 1049, 5, 101, 0, 0, 1049, 1050, 5, 110, 0, 0, 1050, 236, 1, 0, 0, 0, 1051, 1052, 5, 116, 0, 0, 1052, 1053, 5, 111, 0, 0, 1053, 238, 1, 0, 0, 0, 1054, 1055, 5, 116, 0, 0, 1055, 1056, 5, 114, 0, 0, 1056, 1057, 5, 117, 0, 0, 1057, 1058, 5, 101, 0, 0, 1058, 240, 1, 0, 0, 0, 1059, 1060, 5, 116, 0, 0, 1060, 1061, 5, 121, 0, 0, 1061, 1062, 5, 112, 0, 0, 1062, 1063, 5, 101, 0, 0, 1063, 242, 1, 0, 0, 0, 1064, 1065, 5, 116, 0, 0, 1065, 1066, 5, 121, 0, 0, 1066, 1067, 5, 112, 0, 0, 1067, 1068, 5, 101, 0, 0, 1068, 1069, 5, 100, 0, 0, 1069, 244, 1, 0, 0, 0, 1070, 1071, 5, 116, 0, 0, 1071, 1072, 5, 121, 0, 0, 1072, 1073, 5, 112, 0, 0, 1073, 1074, 5, 105, 0, 0, 1074, 1075, 5, 110, 0, 0, 1075, 1076, 5, 103, 0, 0, 1076, 246, 1, 0, 0, 0, 1077, 1078, 5, 117, 0, 0, 1078, 1079, 5, 110, 0, 0, 1079, 1080, 5, 105, 0, 0, 1080, 1081, 5, 111, 0, 0, 1081, 1082, 5, 110, 0, 0, 1082, 1083, 5, 115, 0, 0, 1083, 248, 1, 0, 0, 0, 1084, 1085, 5, 118, 0, 0, 1085, 1086, 5, 97, 0, 0, 1086, 1087, 5, 114, 0, 0, 1087, 1088, 5, 105, 0, 0, 1088, 1089, 5, 97, 0, 0, 1089, 1090, 5, 116, 0, 0, 1090, 1091, 5, 105, 0, 0, 1091, 1092, 5, 111, 0, 0, 1092, 1093, 5, 110, 0, 0, 1093, 250, 1, 0, 0, 0, 1094, 1095, 3, 249, 124, 0, 1095, 1096, 3, 27, 13, 0, 1096, 252, 1, 0, 0, 0, 1097, 1098, 5, 120, 0, 0, 1098, 1099, 5, 111, 0, 0, 1099, 1100, 5, 114, 0, 0, 1100, 254, 1, 0, 0, 0, 1101, 1102, 9, 0, 0, 0, 1102, 256, 1, 0, 0, 0, 8, 0, 293, 299, 304, 309, 315, 321, 323, 1, 6, 0, 0] \ No newline at end of file diff --git a/backend/services/syson-services/src/main/generated/org/eclipse/syson/services/grammars/DirectEditLexer.java b/backend/services/syson-services/src/main/generated/org/eclipse/syson/services/grammars/DirectEditLexer.java index 1b63d375d..28195ce78 100644 --- a/backend/services/syson-services/src/main/generated/org/eclipse/syson/services/grammars/DirectEditLexer.java +++ b/backend/services/syson-services/src/main/generated/org/eclipse/syson/services/grammars/DirectEditLexer.java @@ -32,23 +32,26 @@ public class DirectEditLexer extends Lexer { new PredictionContextCache(); public static final int T__0=1, T__1=2, T__2=3, T__3=4, T__4=5, T__5=6, T__6=7, T__7=8, T__8=9, - T__9=10, T__10=11, T__11=12, T__12=13, T__13=14, WS=15, Boolean=16, Integer=17, - Real=18, DoubleQuotedString=19, ABOUT=20, ABSTRACT=21, ALIAS=22, ALL=23, - AND=24, AS=25, ASSIGN=26, ASSOC=27, BEAHVIOR=28, BINDING=29, BOOL=30, - BY=31, CHAINS=32, CLASS=33, CLASSIFIER=34, COMMENT=35, COMPOSITE=36, CONJUGATE=37, - CONJUGATES=38, CONJUGATION=39, CONNECTOR=40, DATATYPE=41, DEFAULT=42, - DEPENDENCY=43, DERIVED=44, DIFFERENCES=45, DISJOINING=46, DISJOINT=47, - DOC=48, ELSE=49, END=50, EXPR=51, FALSE=52, FEATURE=53, FEATURED=54, FEATURING=55, - FILTER=56, FIRST=57, FLOW=58, FOR=59, FROM=60, FUNCTION=61, HASTYPE=62, - IF=63, INTERSECTS=64, IMPLIES=65, IMPORT=66, IN=67, INPUT=68, INTERACTION=69, - INV=70, INVERSE=71, INVERTING=72, ISTYPE=73, LANGUAGE=74, MEMBER=75, METACLASS=76, - METADATA=77, MULTIPLICITY=78, NAMESPACE=79, NONUNIQUE=80, NOT=81, NULL=82, - OF=83, OR=84, ORDERED=85, OUT=86, PACKAGE=87, PORTION=88, PREDICATE=89, - PRIAVTE=90, PROTECTED=91, PUBLIC=92, READONLY=93, REDEFINES=94, REDEFINITION=95, - RFERENCES=96, REP=97, RETURN=98, SPECIALIZTION=99, SPECIALIZES=100, STEP=101, - STRCUT=102, SUBCLASSIFIER=103, SUBSET=104, SUBSETS=105, SUBTYPE=106, SUCCESSION=107, - THEN=108, TO=109, TRUE=110, TYPE=111, TYPED=112, TYPING=113, UNIONS=114, - XOR=115, ANY=116; + T__9=10, T__10=11, T__11=12, T__12=13, WS=14, Boolean=15, Integer=16, + Real=17, DoubleQuotedString=18, ABOUT=19, ABSTRACT=20, ABSTRACT_PREFIX=21, + ALIAS=22, ALL=23, AND=24, AS=25, ASSIGN=26, ASSOC=27, BEAHVIOR=28, BINDING=29, + BOOL=30, BY=31, CHAINS=32, CLASS=33, CLASSIFIER=34, COMMENT=35, COMPOSITE=36, + CONJUGATE=37, CONJUGATES=38, CONJUGATION=39, CONNECTOR=40, DATATYPE=41, + DEFAULT=42, DEPENDENCY=43, DERIVED=44, DERIVED_PREFIX=45, DIFFERENCES=46, + DISJOINING=47, DISJOINT=48, DOC=49, ELSE=50, END=51, END_PREFIX=52, EXPR=53, + FALSE=54, FEATURE=55, FEATURED=56, FEATURING=57, FILTER=58, FIRST=59, + FLOW=60, FOR=61, FROM=62, FUNCTION=63, HASTYPE=64, IF=65, INTERSECTS=66, + IMPLIES=67, IMPORT=68, IN=69, IN_PREFIX=70, INOUT=71, INOUT_PREFIX=72, + INTERACTION=73, INV=74, INVERSE=75, INVERTING=76, ISTYPE=77, LANGUAGE=78, + MEMBER=79, METACLASS=80, METADATA=81, MULTIPLICITY=82, NAMESPACE=83, NONUNIQUE=84, + NONUNIQUE_SUFFIX=85, NOT=86, NULL=87, OF=88, OR=89, ORDERED=90, ORDERED_SUFFIX=91, + OUT=92, OUT_PREFIX=93, PACKAGE=94, PORTION=95, PREDICATE=96, PRIAVTE=97, + PROTECTED=98, PUBLIC=99, READONLY=100, READONLY_PREFIX=101, REDEFINES=102, + REDEFINITION=103, REF=104, REF_PREFIX=105, REFERENCES=106, REP=107, RETURN=108, + SPECIALIZTION=109, SPECIALIZES=110, STEP=111, STRCUT=112, SUBCLASSIFIER=113, + SUBSET=114, SUBSETS=115, SUBTYPE=116, SUCCESSION=117, THEN=118, TO=119, + TRUE=120, TYPE=121, TYPED=122, TYPING=123, UNIONS=124, VARIATION=125, + VARIATION_PREFIX=126, XOR=127, ANY=128; public static String[] channelNames = { "DEFAULT_TOKEN_CHANNEL", "HIDDEN" }; @@ -60,67 +63,74 @@ public class DirectEditLexer extends Lexer { private static String[] makeRuleNames() { return new String[] { "T__0", "T__1", "T__2", "T__3", "T__4", "T__5", "T__6", "T__7", "T__8", - "T__9", "T__10", "T__11", "T__12", "T__13", "WS", "Boolean", "Integer", - "Real", "DoubleQuotedString", "ABOUT", "ABSTRACT", "ALIAS", "ALL", "AND", - "AS", "ASSIGN", "ASSOC", "BEAHVIOR", "BINDING", "BOOL", "BY", "CHAINS", - "CLASS", "CLASSIFIER", "COMMENT", "COMPOSITE", "CONJUGATE", "CONJUGATES", - "CONJUGATION", "CONNECTOR", "DATATYPE", "DEFAULT", "DEPENDENCY", "DERIVED", - "DIFFERENCES", "DISJOINING", "DISJOINT", "DOC", "ELSE", "END", "EXPR", - "FALSE", "FEATURE", "FEATURED", "FEATURING", "FILTER", "FIRST", "FLOW", - "FOR", "FROM", "FUNCTION", "HASTYPE", "IF", "INTERSECTS", "IMPLIES", - "IMPORT", "IN", "INPUT", "INTERACTION", "INV", "INVERSE", "INVERTING", - "ISTYPE", "LANGUAGE", "MEMBER", "METACLASS", "METADATA", "MULTIPLICITY", - "NAMESPACE", "NONUNIQUE", "NOT", "NULL", "OF", "OR", "ORDERED", "OUT", - "PACKAGE", "PORTION", "PREDICATE", "PRIAVTE", "PROTECTED", "PUBLIC", - "READONLY", "REDEFINES", "REDEFINITION", "RFERENCES", "REP", "RETURN", - "SPECIALIZTION", "SPECIALIZES", "STEP", "STRCUT", "SUBCLASSIFIER", "SUBSET", - "SUBSETS", "SUBTYPE", "SUCCESSION", "THEN", "TO", "TRUE", "TYPE", "TYPED", - "TYPING", "UNIONS", "XOR", "ANY" + "T__9", "T__10", "T__11", "T__12", "WS", "Boolean", "Integer", "Real", + "DoubleQuotedString", "ABOUT", "ABSTRACT", "ABSTRACT_PREFIX", "ALIAS", + "ALL", "AND", "AS", "ASSIGN", "ASSOC", "BEAHVIOR", "BINDING", "BOOL", + "BY", "CHAINS", "CLASS", "CLASSIFIER", "COMMENT", "COMPOSITE", "CONJUGATE", + "CONJUGATES", "CONJUGATION", "CONNECTOR", "DATATYPE", "DEFAULT", "DEPENDENCY", + "DERIVED", "DERIVED_PREFIX", "DIFFERENCES", "DISJOINING", "DISJOINT", + "DOC", "ELSE", "END", "END_PREFIX", "EXPR", "FALSE", "FEATURE", "FEATURED", + "FEATURING", "FILTER", "FIRST", "FLOW", "FOR", "FROM", "FUNCTION", "HASTYPE", + "IF", "INTERSECTS", "IMPLIES", "IMPORT", "IN", "IN_PREFIX", "INOUT", + "INOUT_PREFIX", "INTERACTION", "INV", "INVERSE", "INVERTING", "ISTYPE", + "LANGUAGE", "MEMBER", "METACLASS", "METADATA", "MULTIPLICITY", "NAMESPACE", + "NONUNIQUE", "NONUNIQUE_SUFFIX", "NOT", "NULL", "OF", "OR", "ORDERED", + "ORDERED_SUFFIX", "OUT", "OUT_PREFIX", "PACKAGE", "PORTION", "PREDICATE", + "PRIAVTE", "PROTECTED", "PUBLIC", "READONLY", "READONLY_PREFIX", "REDEFINES", + "REDEFINITION", "REF", "REF_PREFIX", "REFERENCES", "REP", "RETURN", "SPECIALIZTION", + "SPECIALIZES", "STEP", "STRCUT", "SUBCLASSIFIER", "SUBSET", "SUBSETS", + "SUBTYPE", "SUCCESSION", "THEN", "TO", "TRUE", "TYPE", "TYPED", "TYPING", + "UNIONS", "VARIATION", "VARIATION_PREFIX", "XOR", "ANY" }; } public static final String[] ruleNames = makeRuleNames(); private static String[] makeLiteralNames() { return new String[] { - null, "'ref '", "'['", "'..'", "']'", "'*'", "':>'", "':>>'", "':'", - "'='", "'|'", "'/'", "','", "'::'", "'::>'", null, null, null, null, - null, "'about'", "'abstract'", "'alias'", "'all'", "'and'", "'as'", "'assign'", + null, "'['", "'..'", "']'", "'*'", "':>'", "':>>'", "':'", "'='", "'|'", + "'/'", "','", "'::'", "'::>'", null, null, null, null, null, "'about'", + "'abstract'", null, "'alias'", "'all'", "'and'", "'as'", "'assign'", "'assoc'", "'behavior'", "'binding'", "'bool'", "'by'", "'chains'", "'class'", "'classifier'", "'comment'", "'composite'", "'conjugate'", "'conjugates'", "'conjugation'", "'connector'", "'datatype'", "'default'", "'dependency'", - "'derived'", "'differences'", "'disjoining'", "'disjoint'", "'doc'", - "'else'", "'end'", "'expr'", "'false'", "'feature'", "'featured'", "'featuring'", - "'filter'", "'first'", "'flow'", "'for'", "'from'", "'function'", "'hastype'", - "'if'", "'intersects'", "'implies'", "'import'", "'in'", "'inout'", "'interaction'", - "'inv'", "'inverse'", "'inverting'", "'istype'", "'language'", "'member'", - "'metaclass'", "'metadata'", "'multiplicity'", "'namespace'", "'nonunique'", - "'not'", "'null'", "'of'", "'or'", "'ordered'", "'out'", "'package'", - "'portion'", "'predicate'", "'private'", "'protected'", "'public'", "'readonly'", - "'redefines'", "'redefinition'", "'references'", "'rep'", "'return'", + "'derived'", null, "'differences'", "'disjoining'", "'disjoint'", "'doc'", + "'else'", "'end'", null, "'expr'", "'false'", "'feature'", "'featured'", + "'featuring'", "'filter'", "'first'", "'flow'", "'for'", "'from'", "'function'", + "'hastype'", "'if'", "'intersects'", "'implies'", "'import'", "'in'", + null, "'inout'", null, "'interaction'", "'inv'", "'inverse'", "'inverting'", + "'istype'", "'language'", "'member'", "'metaclass'", "'metadata'", "'multiplicity'", + "'namespace'", "'nonunique'", null, "'not'", "'null'", "'of'", "'or'", + "'ordered'", null, "'out'", null, "'package'", "'portion'", "'predicate'", + "'private'", "'protected'", "'public'", "'readonly'", null, "'redefines'", + "'redefinition'", "'ref'", null, "'references'", "'rep'", "'return'", "'specialization'", "'specializes'", "'step'", "'struct'", "'subclassifier'", "'subset'", "'subsets'", "'subtype'", "'succession'", "'then'", "'to'", - "'true'", "'type'", "'typed'", "'typing'", "'unions'", "'xor'" + "'true'", "'type'", "'typed'", "'typing'", "'unions'", "'variation'", + null, "'xor'" }; } private static final String[] _LITERAL_NAMES = makeLiteralNames(); private static String[] makeSymbolicNames() { return new String[] { null, null, null, null, null, null, null, null, null, null, null, null, - null, null, null, "WS", "Boolean", "Integer", "Real", "DoubleQuotedString", - "ABOUT", "ABSTRACT", "ALIAS", "ALL", "AND", "AS", "ASSIGN", "ASSOC", - "BEAHVIOR", "BINDING", "BOOL", "BY", "CHAINS", "CLASS", "CLASSIFIER", - "COMMENT", "COMPOSITE", "CONJUGATE", "CONJUGATES", "CONJUGATION", "CONNECTOR", - "DATATYPE", "DEFAULT", "DEPENDENCY", "DERIVED", "DIFFERENCES", "DISJOINING", - "DISJOINT", "DOC", "ELSE", "END", "EXPR", "FALSE", "FEATURE", "FEATURED", - "FEATURING", "FILTER", "FIRST", "FLOW", "FOR", "FROM", "FUNCTION", "HASTYPE", - "IF", "INTERSECTS", "IMPLIES", "IMPORT", "IN", "INPUT", "INTERACTION", + null, null, "WS", "Boolean", "Integer", "Real", "DoubleQuotedString", + "ABOUT", "ABSTRACT", "ABSTRACT_PREFIX", "ALIAS", "ALL", "AND", "AS", + "ASSIGN", "ASSOC", "BEAHVIOR", "BINDING", "BOOL", "BY", "CHAINS", "CLASS", + "CLASSIFIER", "COMMENT", "COMPOSITE", "CONJUGATE", "CONJUGATES", "CONJUGATION", + "CONNECTOR", "DATATYPE", "DEFAULT", "DEPENDENCY", "DERIVED", "DERIVED_PREFIX", + "DIFFERENCES", "DISJOINING", "DISJOINT", "DOC", "ELSE", "END", "END_PREFIX", + "EXPR", "FALSE", "FEATURE", "FEATURED", "FEATURING", "FILTER", "FIRST", + "FLOW", "FOR", "FROM", "FUNCTION", "HASTYPE", "IF", "INTERSECTS", "IMPLIES", + "IMPORT", "IN", "IN_PREFIX", "INOUT", "INOUT_PREFIX", "INTERACTION", "INV", "INVERSE", "INVERTING", "ISTYPE", "LANGUAGE", "MEMBER", "METACLASS", - "METADATA", "MULTIPLICITY", "NAMESPACE", "NONUNIQUE", "NOT", "NULL", - "OF", "OR", "ORDERED", "OUT", "PACKAGE", "PORTION", "PREDICATE", "PRIAVTE", - "PROTECTED", "PUBLIC", "READONLY", "REDEFINES", "REDEFINITION", "RFERENCES", - "REP", "RETURN", "SPECIALIZTION", "SPECIALIZES", "STEP", "STRCUT", "SUBCLASSIFIER", - "SUBSET", "SUBSETS", "SUBTYPE", "SUCCESSION", "THEN", "TO", "TRUE", "TYPE", - "TYPED", "TYPING", "UNIONS", "XOR", "ANY" + "METADATA", "MULTIPLICITY", "NAMESPACE", "NONUNIQUE", "NONUNIQUE_SUFFIX", + "NOT", "NULL", "OF", "OR", "ORDERED", "ORDERED_SUFFIX", "OUT", "OUT_PREFIX", + "PACKAGE", "PORTION", "PREDICATE", "PRIAVTE", "PROTECTED", "PUBLIC", + "READONLY", "READONLY_PREFIX", "REDEFINES", "REDEFINITION", "REF", "REF_PREFIX", + "REFERENCES", "REP", "RETURN", "SPECIALIZTION", "SPECIALIZES", "STEP", + "STRCUT", "SUBCLASSIFIER", "SUBSET", "SUBSETS", "SUBTYPE", "SUCCESSION", + "THEN", "TO", "TRUE", "TYPE", "TYPED", "TYPING", "UNIONS", "VARIATION", + "VARIATION_PREFIX", "XOR", "ANY" }; } private static final String[] _SYMBOLIC_NAMES = makeSymbolicNames(); @@ -182,48 +192,50 @@ public DirectEditLexer(CharStream input) { public ATN getATN() { return _ATN; } public static final String _serializedATN = - "\u0004\u0000t\u040d\u0006\uffff\uffff\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\f\u0007\f\u0002\r\u0007\r\u0002\u000e\u0007\u000e\u0002"+ - "\u000f\u0007\u000f\u0002\u0010\u0007\u0010\u0002\u0011\u0007\u0011\u0002"+ - "\u0012\u0007\u0012\u0002\u0013\u0007\u0013\u0002\u0014\u0007\u0014\u0002"+ - "\u0015\u0007\u0015\u0002\u0016\u0007\u0016\u0002\u0017\u0007\u0017\u0002"+ - "\u0018\u0007\u0018\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\'\u0002(\u0007(\u0002)\u0007)\u0002*\u0007*\u0002+\u0007"+ - "+\u0002,\u0007,\u0002-\u0007-\u0002.\u0007.\u0002/\u0007/\u00020\u0007"+ - "0\u00021\u00071\u00022\u00072\u00023\u00073\u00024\u00074\u00025\u0007"+ - "5\u00026\u00076\u00027\u00077\u00028\u00078\u00029\u00079\u0002:\u0007"+ - ":\u0002;\u0007;\u0002<\u0007<\u0002=\u0007=\u0002>\u0007>\u0002?\u0007"+ - "?\u0002@\u0007@\u0002A\u0007A\u0002B\u0007B\u0002C\u0007C\u0002D\u0007"+ - "D\u0002E\u0007E\u0002F\u0007F\u0002G\u0007G\u0002H\u0007H\u0002I\u0007"+ - "I\u0002J\u0007J\u0002K\u0007K\u0002L\u0007L\u0002M\u0007M\u0002N\u0007"+ - "N\u0002O\u0007O\u0002P\u0007P\u0002Q\u0007Q\u0002R\u0007R\u0002S\u0007"+ - "S\u0002T\u0007T\u0002U\u0007U\u0002V\u0007V\u0002W\u0007W\u0002X\u0007"+ - "X\u0002Y\u0007Y\u0002Z\u0007Z\u0002[\u0007[\u0002\\\u0007\\\u0002]\u0007"+ - "]\u0002^\u0007^\u0002_\u0007_\u0002`\u0007`\u0002a\u0007a\u0002b\u0007"+ - "b\u0002c\u0007c\u0002d\u0007d\u0002e\u0007e\u0002f\u0007f\u0002g\u0007"+ - "g\u0002h\u0007h\u0002i\u0007i\u0002j\u0007j\u0002k\u0007k\u0002l\u0007"+ - "l\u0002m\u0007m\u0002n\u0007n\u0002o\u0007o\u0002p\u0007p\u0002q\u0007"+ - "q\u0002r\u0007r\u0002s\u0007s\u0001\u0000\u0001\u0000\u0001\u0000\u0001"+ - "\u0000\u0001\u0000\u0001\u0001\u0001\u0001\u0001\u0002\u0001\u0002\u0001"+ - "\u0002\u0001\u0003\u0001\u0003\u0001\u0004\u0001\u0004\u0001\u0005\u0001"+ - "\u0005\u0001\u0005\u0001\u0006\u0001\u0006\u0001\u0006\u0001\u0006\u0001"+ - "\u0007\u0001\u0007\u0001\b\u0001\b\u0001\t\u0001\t\u0001\n\u0001\n\u0001"+ - "\u000b\u0001\u000b\u0001\f\u0001\f\u0001\f\u0001\r\u0001\r\u0001\r\u0001"+ - "\r\u0001\u000e\u0004\u000e\u0111\b\u000e\u000b\u000e\f\u000e\u0112\u0001"+ - "\u000e\u0001\u000e\u0001\u000f\u0001\u000f\u0003\u000f\u0119\b\u000f\u0001"+ - "\u0010\u0004\u0010\u011c\b\u0010\u000b\u0010\f\u0010\u011d\u0001\u0011"+ - "\u0004\u0011\u0121\b\u0011\u000b\u0011\f\u0011\u0122\u0001\u0011\u0001"+ - "\u0011\u0004\u0011\u0127\b\u0011\u000b\u0011\f\u0011\u0128\u0001\u0012"+ - "\u0001\u0012\u0001\u0012\u0001\u0012\u0005\u0012\u012f\b\u0012\n\u0012"+ - "\f\u0012\u0132\t\u0012\u0001\u0012\u0001\u0012\u0001\u0013\u0001\u0013"+ + "\u0004\u0000\u0080\u044f\u0006\uffff\uffff\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\f\u0007\f\u0002\r\u0007\r\u0002\u000e\u0007\u000e"+ + "\u0002\u000f\u0007\u000f\u0002\u0010\u0007\u0010\u0002\u0011\u0007\u0011"+ + "\u0002\u0012\u0007\u0012\u0002\u0013\u0007\u0013\u0002\u0014\u0007\u0014"+ + "\u0002\u0015\u0007\u0015\u0002\u0016\u0007\u0016\u0002\u0017\u0007\u0017"+ + "\u0002\u0018\u0007\u0018\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\'\u0002(\u0007(\u0002)\u0007)\u0002*\u0007*\u0002"+ + "+\u0007+\u0002,\u0007,\u0002-\u0007-\u0002.\u0007.\u0002/\u0007/\u0002"+ + "0\u00070\u00021\u00071\u00022\u00072\u00023\u00073\u00024\u00074\u0002"+ + "5\u00075\u00026\u00076\u00027\u00077\u00028\u00078\u00029\u00079\u0002"+ + ":\u0007:\u0002;\u0007;\u0002<\u0007<\u0002=\u0007=\u0002>\u0007>\u0002"+ + "?\u0007?\u0002@\u0007@\u0002A\u0007A\u0002B\u0007B\u0002C\u0007C\u0002"+ + "D\u0007D\u0002E\u0007E\u0002F\u0007F\u0002G\u0007G\u0002H\u0007H\u0002"+ + "I\u0007I\u0002J\u0007J\u0002K\u0007K\u0002L\u0007L\u0002M\u0007M\u0002"+ + "N\u0007N\u0002O\u0007O\u0002P\u0007P\u0002Q\u0007Q\u0002R\u0007R\u0002"+ + "S\u0007S\u0002T\u0007T\u0002U\u0007U\u0002V\u0007V\u0002W\u0007W\u0002"+ + "X\u0007X\u0002Y\u0007Y\u0002Z\u0007Z\u0002[\u0007[\u0002\\\u0007\\\u0002"+ + "]\u0007]\u0002^\u0007^\u0002_\u0007_\u0002`\u0007`\u0002a\u0007a\u0002"+ + "b\u0007b\u0002c\u0007c\u0002d\u0007d\u0002e\u0007e\u0002f\u0007f\u0002"+ + "g\u0007g\u0002h\u0007h\u0002i\u0007i\u0002j\u0007j\u0002k\u0007k\u0002"+ + "l\u0007l\u0002m\u0007m\u0002n\u0007n\u0002o\u0007o\u0002p\u0007p\u0002"+ + "q\u0007q\u0002r\u0007r\u0002s\u0007s\u0002t\u0007t\u0002u\u0007u\u0002"+ + "v\u0007v\u0002w\u0007w\u0002x\u0007x\u0002y\u0007y\u0002z\u0007z\u0002"+ + "{\u0007{\u0002|\u0007|\u0002}\u0007}\u0002~\u0007~\u0002\u007f\u0007\u007f"+ + "\u0001\u0000\u0001\u0000\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0002"+ + "\u0001\u0002\u0001\u0003\u0001\u0003\u0001\u0004\u0001\u0004\u0001\u0004"+ + "\u0001\u0005\u0001\u0005\u0001\u0005\u0001\u0005\u0001\u0006\u0001\u0006"+ + "\u0001\u0007\u0001\u0007\u0001\b\u0001\b\u0001\t\u0001\t\u0001\n\u0001"+ + "\n\u0001\u000b\u0001\u000b\u0001\u000b\u0001\f\u0001\f\u0001\f\u0001\f"+ + "\u0001\r\u0004\r\u0124\b\r\u000b\r\f\r\u0125\u0001\r\u0001\r\u0001\u000e"+ + "\u0001\u000e\u0003\u000e\u012c\b\u000e\u0001\u000f\u0004\u000f\u012f\b"+ + "\u000f\u000b\u000f\f\u000f\u0130\u0001\u0010\u0004\u0010\u0134\b\u0010"+ + "\u000b\u0010\f\u0010\u0135\u0001\u0010\u0001\u0010\u0004\u0010\u013a\b"+ + "\u0010\u000b\u0010\f\u0010\u013b\u0001\u0011\u0001\u0011\u0001\u0011\u0001"+ + "\u0011\u0005\u0011\u0142\b\u0011\n\u0011\f\u0011\u0145\t\u0011\u0001\u0011"+ + "\u0001\u0011\u0001\u0012\u0001\u0012\u0001\u0012\u0001\u0012\u0001\u0012"+ + "\u0001\u0012\u0001\u0013\u0001\u0013\u0001\u0013\u0001\u0013\u0001\u0013"+ "\u0001\u0013\u0001\u0013\u0001\u0013\u0001\u0013\u0001\u0014\u0001\u0014"+ - "\u0001\u0014\u0001\u0014\u0001\u0014\u0001\u0014\u0001\u0014\u0001\u0014"+ "\u0001\u0014\u0001\u0015\u0001\u0015\u0001\u0015\u0001\u0015\u0001\u0015"+ "\u0001\u0015\u0001\u0016\u0001\u0016\u0001\u0016\u0001\u0016\u0001\u0017"+ "\u0001\u0017\u0001\u0017\u0001\u0017\u0001\u0018\u0001\u0018\u0001\u0018"+ @@ -246,535 +258,573 @@ public DirectEditLexer(CharStream input) { "(\u0001(\u0001(\u0001(\u0001(\u0001)\u0001)\u0001)\u0001)\u0001)\u0001"+ ")\u0001)\u0001)\u0001*\u0001*\u0001*\u0001*\u0001*\u0001*\u0001*\u0001"+ "*\u0001*\u0001*\u0001*\u0001+\u0001+\u0001+\u0001+\u0001+\u0001+\u0001"+ - "+\u0001+\u0001,\u0001,\u0001,\u0001,\u0001,\u0001,\u0001,\u0001,\u0001"+ - ",\u0001,\u0001,\u0001,\u0001-\u0001-\u0001-\u0001-\u0001-\u0001-\u0001"+ - "-\u0001-\u0001-\u0001-\u0001-\u0001.\u0001.\u0001.\u0001.\u0001.\u0001"+ - ".\u0001.\u0001.\u0001.\u0001/\u0001/\u0001/\u0001/\u00010\u00010\u0001"+ - "0\u00010\u00010\u00011\u00011\u00011\u00011\u00012\u00012\u00012\u0001"+ - "2\u00012\u00013\u00013\u00013\u00013\u00013\u00013\u00014\u00014\u0001"+ - "4\u00014\u00014\u00014\u00014\u00014\u00015\u00015\u00015\u00015\u0001"+ - "5\u00015\u00015\u00015\u00015\u00016\u00016\u00016\u00016\u00016\u0001"+ - "6\u00016\u00016\u00016\u00016\u00017\u00017\u00017\u00017\u00017\u0001"+ - "7\u00017\u00018\u00018\u00018\u00018\u00018\u00018\u00019\u00019\u0001"+ - "9\u00019\u00019\u0001:\u0001:\u0001:\u0001:\u0001;\u0001;\u0001;\u0001"+ - ";\u0001;\u0001<\u0001<\u0001<\u0001<\u0001<\u0001<\u0001<\u0001<\u0001"+ - "<\u0001=\u0001=\u0001=\u0001=\u0001=\u0001=\u0001=\u0001=\u0001>\u0001"+ - ">\u0001>\u0001?\u0001?\u0001?\u0001?\u0001?\u0001?\u0001?\u0001?\u0001"+ - "?\u0001?\u0001?\u0001@\u0001@\u0001@\u0001@\u0001@\u0001@\u0001@\u0001"+ - "@\u0001A\u0001A\u0001A\u0001A\u0001A\u0001A\u0001A\u0001B\u0001B\u0001"+ - "B\u0001C\u0001C\u0001C\u0001C\u0001C\u0001C\u0001D\u0001D\u0001D\u0001"+ - "D\u0001D\u0001D\u0001D\u0001D\u0001D\u0001D\u0001D\u0001D\u0001E\u0001"+ - "E\u0001E\u0001E\u0001F\u0001F\u0001F\u0001F\u0001F\u0001F\u0001F\u0001"+ - "F\u0001G\u0001G\u0001G\u0001G\u0001G\u0001G\u0001G\u0001G\u0001G\u0001"+ - "G\u0001H\u0001H\u0001H\u0001H\u0001H\u0001H\u0001H\u0001I\u0001I\u0001"+ - "I\u0001I\u0001I\u0001I\u0001I\u0001I\u0001I\u0001J\u0001J\u0001J\u0001"+ - "J\u0001J\u0001J\u0001J\u0001K\u0001K\u0001K\u0001K\u0001K\u0001K\u0001"+ - "K\u0001K\u0001K\u0001K\u0001L\u0001L\u0001L\u0001L\u0001L\u0001L\u0001"+ - "L\u0001L\u0001L\u0001M\u0001M\u0001M\u0001M\u0001M\u0001M\u0001M\u0001"+ - "M\u0001M\u0001M\u0001M\u0001M\u0001M\u0001N\u0001N\u0001N\u0001N\u0001"+ + "+\u0001+\u0001,\u0001,\u0001,\u0001-\u0001-\u0001-\u0001-\u0001-\u0001"+ + "-\u0001-\u0001-\u0001-\u0001-\u0001-\u0001-\u0001.\u0001.\u0001.\u0001"+ + ".\u0001.\u0001.\u0001.\u0001.\u0001.\u0001.\u0001.\u0001/\u0001/\u0001"+ + "/\u0001/\u0001/\u0001/\u0001/\u0001/\u0001/\u00010\u00010\u00010\u0001"+ + "0\u00011\u00011\u00011\u00011\u00011\u00012\u00012\u00012\u00012\u0001"+ + "3\u00013\u00013\u00014\u00014\u00014\u00014\u00014\u00015\u00015\u0001"+ + "5\u00015\u00015\u00015\u00016\u00016\u00016\u00016\u00016\u00016\u0001"+ + "6\u00016\u00017\u00017\u00017\u00017\u00017\u00017\u00017\u00017\u0001"+ + "7\u00018\u00018\u00018\u00018\u00018\u00018\u00018\u00018\u00018\u0001"+ + "8\u00019\u00019\u00019\u00019\u00019\u00019\u00019\u0001:\u0001:\u0001"+ + ":\u0001:\u0001:\u0001:\u0001;\u0001;\u0001;\u0001;\u0001;\u0001<\u0001"+ + "<\u0001<\u0001<\u0001=\u0001=\u0001=\u0001=\u0001=\u0001>\u0001>\u0001"+ + ">\u0001>\u0001>\u0001>\u0001>\u0001>\u0001>\u0001?\u0001?\u0001?\u0001"+ + "?\u0001?\u0001?\u0001?\u0001?\u0001@\u0001@\u0001@\u0001A\u0001A\u0001"+ + "A\u0001A\u0001A\u0001A\u0001A\u0001A\u0001A\u0001A\u0001A\u0001B\u0001"+ + "B\u0001B\u0001B\u0001B\u0001B\u0001B\u0001B\u0001C\u0001C\u0001C\u0001"+ + "C\u0001C\u0001C\u0001C\u0001D\u0001D\u0001D\u0001E\u0001E\u0001E\u0001"+ + "F\u0001F\u0001F\u0001F\u0001F\u0001F\u0001G\u0001G\u0001G\u0001H\u0001"+ + "H\u0001H\u0001H\u0001H\u0001H\u0001H\u0001H\u0001H\u0001H\u0001H\u0001"+ + "H\u0001I\u0001I\u0001I\u0001I\u0001J\u0001J\u0001J\u0001J\u0001J\u0001"+ + "J\u0001J\u0001J\u0001K\u0001K\u0001K\u0001K\u0001K\u0001K\u0001K\u0001"+ + "K\u0001K\u0001K\u0001L\u0001L\u0001L\u0001L\u0001L\u0001L\u0001L\u0001"+ + "M\u0001M\u0001M\u0001M\u0001M\u0001M\u0001M\u0001M\u0001M\u0001N\u0001"+ "N\u0001N\u0001N\u0001N\u0001N\u0001N\u0001O\u0001O\u0001O\u0001O\u0001"+ "O\u0001O\u0001O\u0001O\u0001O\u0001O\u0001P\u0001P\u0001P\u0001P\u0001"+ - "Q\u0001Q\u0001Q\u0001Q\u0001Q\u0001R\u0001R\u0001R\u0001S\u0001S\u0001"+ - "S\u0001T\u0001T\u0001T\u0001T\u0001T\u0001T\u0001T\u0001T\u0001U\u0001"+ - "U\u0001U\u0001U\u0001V\u0001V\u0001V\u0001V\u0001V\u0001V\u0001V\u0001"+ - "V\u0001W\u0001W\u0001W\u0001W\u0001W\u0001W\u0001W\u0001W\u0001X\u0001"+ - "X\u0001X\u0001X\u0001X\u0001X\u0001X\u0001X\u0001X\u0001X\u0001Y\u0001"+ - "Y\u0001Y\u0001Y\u0001Y\u0001Y\u0001Y\u0001Y\u0001Z\u0001Z\u0001Z\u0001"+ - "Z\u0001Z\u0001Z\u0001Z\u0001Z\u0001Z\u0001Z\u0001[\u0001[\u0001[\u0001"+ - "[\u0001[\u0001[\u0001[\u0001\\\u0001\\\u0001\\\u0001\\\u0001\\\u0001\\"+ - "\u0001\\\u0001\\\u0001\\\u0001]\u0001]\u0001]\u0001]\u0001]\u0001]\u0001"+ - "]\u0001]\u0001]\u0001]\u0001^\u0001^\u0001^\u0001^\u0001^\u0001^\u0001"+ - "^\u0001^\u0001^\u0001^\u0001^\u0001^\u0001^\u0001_\u0001_\u0001_\u0001"+ - "_\u0001_\u0001_\u0001_\u0001_\u0001_\u0001_\u0001_\u0001`\u0001`\u0001"+ - "`\u0001`\u0001a\u0001a\u0001a\u0001a\u0001a\u0001a\u0001a\u0001b\u0001"+ - "b\u0001b\u0001b\u0001b\u0001b\u0001b\u0001b\u0001b\u0001b\u0001b\u0001"+ - "b\u0001b\u0001b\u0001b\u0001c\u0001c\u0001c\u0001c\u0001c\u0001c\u0001"+ - "c\u0001c\u0001c\u0001c\u0001c\u0001c\u0001d\u0001d\u0001d\u0001d\u0001"+ - "d\u0001e\u0001e\u0001e\u0001e\u0001e\u0001e\u0001e\u0001f\u0001f\u0001"+ + "P\u0001P\u0001P\u0001P\u0001P\u0001Q\u0001Q\u0001Q\u0001Q\u0001Q\u0001"+ + "Q\u0001Q\u0001Q\u0001Q\u0001Q\u0001Q\u0001Q\u0001Q\u0001R\u0001R\u0001"+ + "R\u0001R\u0001R\u0001R\u0001R\u0001R\u0001R\u0001R\u0001S\u0001S\u0001"+ + "S\u0001S\u0001S\u0001S\u0001S\u0001S\u0001S\u0001S\u0001T\u0001T\u0001"+ + "T\u0001U\u0001U\u0001U\u0001U\u0001V\u0001V\u0001V\u0001V\u0001V\u0001"+ + "W\u0001W\u0001W\u0001X\u0001X\u0001X\u0001Y\u0001Y\u0001Y\u0001Y\u0001"+ + "Y\u0001Y\u0001Y\u0001Y\u0001Z\u0001Z\u0001Z\u0001[\u0001[\u0001[\u0001"+ + "[\u0001\\\u0001\\\u0001\\\u0001]\u0001]\u0001]\u0001]\u0001]\u0001]\u0001"+ + "]\u0001]\u0001^\u0001^\u0001^\u0001^\u0001^\u0001^\u0001^\u0001^\u0001"+ + "_\u0001_\u0001_\u0001_\u0001_\u0001_\u0001_\u0001_\u0001_\u0001_\u0001"+ + "`\u0001`\u0001`\u0001`\u0001`\u0001`\u0001`\u0001`\u0001a\u0001a\u0001"+ + "a\u0001a\u0001a\u0001a\u0001a\u0001a\u0001a\u0001a\u0001b\u0001b\u0001"+ + "b\u0001b\u0001b\u0001b\u0001b\u0001c\u0001c\u0001c\u0001c\u0001c\u0001"+ + "c\u0001c\u0001c\u0001c\u0001d\u0001d\u0001d\u0001e\u0001e\u0001e\u0001"+ + "e\u0001e\u0001e\u0001e\u0001e\u0001e\u0001e\u0001f\u0001f\u0001f\u0001"+ "f\u0001f\u0001f\u0001f\u0001f\u0001f\u0001f\u0001f\u0001f\u0001f\u0001"+ - "f\u0001f\u0001g\u0001g\u0001g\u0001g\u0001g\u0001g\u0001g\u0001h\u0001"+ - "h\u0001h\u0001h\u0001h\u0001h\u0001h\u0001h\u0001i\u0001i\u0001i\u0001"+ - "i\u0001i\u0001i\u0001i\u0001i\u0001j\u0001j\u0001j\u0001j\u0001j\u0001"+ - "j\u0001j\u0001j\u0001j\u0001j\u0001j\u0001k\u0001k\u0001k\u0001k\u0001"+ - "k\u0001l\u0001l\u0001l\u0001m\u0001m\u0001m\u0001m\u0001m\u0001n\u0001"+ - "n\u0001n\u0001n\u0001n\u0001o\u0001o\u0001o\u0001o\u0001o\u0001o\u0001"+ - "p\u0001p\u0001p\u0001p\u0001p\u0001p\u0001p\u0001q\u0001q\u0001q\u0001"+ - "q\u0001q\u0001q\u0001q\u0001r\u0001r\u0001r\u0001r\u0001s\u0001s\u0000"+ - "\u0000t\u0001\u0001\u0003\u0002\u0005\u0003\u0007\u0004\t\u0005\u000b"+ - "\u0006\r\u0007\u000f\b\u0011\t\u0013\n\u0015\u000b\u0017\f\u0019\r\u001b"+ - "\u000e\u001d\u000f\u001f\u0010!\u0011#\u0012%\u0013\'\u0014)\u0015+\u0016"+ - "-\u0017/\u00181\u00193\u001a5\u001b7\u001c9\u001d;\u001e=\u001f? A!C\""+ - "E#G$I%K&M\'O(Q)S*U+W,Y-[.]/_0a1c2e3g4i5k6m7o8q9s:u;w}?\u007f@\u0081"+ - "A\u0083B\u0085C\u0087D\u0089E\u008bF\u008dG\u008fH\u0091I\u0093J\u0095"+ - "K\u0097L\u0099M\u009bN\u009dO\u009fP\u00a1Q\u00a3R\u00a5S\u00a7T\u00a9"+ - "U\u00abV\u00adW\u00afX\u00b1Y\u00b3Z\u00b5[\u00b7\\\u00b9]\u00bb^\u00bd"+ - "_\u00bf`\u00c1a\u00c3b\u00c5c\u00c7d\u00c9e\u00cbf\u00cdg\u00cfh\u00d1"+ - "i\u00d3j\u00d5k\u00d7l\u00d9m\u00dbn\u00ddo\u00dfp\u00e1q\u00e3r\u00e5"+ - "s\u00e7t\u0001\u0000\u0003\u0003\u0000\t\n\f\r \u0001\u000009\u0003\u0000"+ - "\n\n\r\r\"\"\u0413\u0000\u0001\u0001\u0000\u0000\u0000\u0000\u0003\u0001"+ - "\u0000\u0000\u0000\u0000\u0005\u0001\u0000\u0000\u0000\u0000\u0007\u0001"+ - "\u0000\u0000\u0000\u0000\t\u0001\u0000\u0000\u0000\u0000\u000b\u0001\u0000"+ - "\u0000\u0000\u0000\r\u0001\u0000\u0000\u0000\u0000\u000f\u0001\u0000\u0000"+ - "\u0000\u0000\u0011\u0001\u0000\u0000\u0000\u0000\u0013\u0001\u0000\u0000"+ - "\u0000\u0000\u0015\u0001\u0000\u0000\u0000\u0000\u0017\u0001\u0000\u0000"+ - "\u0000\u0000\u0019\u0001\u0000\u0000\u0000\u0000\u001b\u0001\u0000\u0000"+ - "\u0000\u0000\u001d\u0001\u0000\u0000\u0000\u0000\u001f\u0001\u0000\u0000"+ - "\u0000\u0000!\u0001\u0000\u0000\u0000\u0000#\u0001\u0000\u0000\u0000\u0000"+ - "%\u0001\u0000\u0000\u0000\u0000\'\u0001\u0000\u0000\u0000\u0000)\u0001"+ - "\u0000\u0000\u0000\u0000+\u0001\u0000\u0000\u0000\u0000-\u0001\u0000\u0000"+ - "\u0000\u0000/\u0001\u0000\u0000\u0000\u00001\u0001\u0000\u0000\u0000\u0000"+ - "3\u0001\u0000\u0000\u0000\u00005\u0001\u0000\u0000\u0000\u00007\u0001"+ - "\u0000\u0000\u0000\u00009\u0001\u0000\u0000\u0000\u0000;\u0001\u0000\u0000"+ - "\u0000\u0000=\u0001\u0000\u0000\u0000\u0000?\u0001\u0000\u0000\u0000\u0000"+ - "A\u0001\u0000\u0000\u0000\u0000C\u0001\u0000\u0000\u0000\u0000E\u0001"+ - "\u0000\u0000\u0000\u0000G\u0001\u0000\u0000\u0000\u0000I\u0001\u0000\u0000"+ - "\u0000\u0000K\u0001\u0000\u0000\u0000\u0000M\u0001\u0000\u0000\u0000\u0000"+ - "O\u0001\u0000\u0000\u0000\u0000Q\u0001\u0000\u0000\u0000\u0000S\u0001"+ - "\u0000\u0000\u0000\u0000U\u0001\u0000\u0000\u0000\u0000W\u0001\u0000\u0000"+ - "\u0000\u0000Y\u0001\u0000\u0000\u0000\u0000[\u0001\u0000\u0000\u0000\u0000"+ - "]\u0001\u0000\u0000\u0000\u0000_\u0001\u0000\u0000\u0000\u0000a\u0001"+ - "\u0000\u0000\u0000\u0000c\u0001\u0000\u0000\u0000\u0000e\u0001\u0000\u0000"+ - "\u0000\u0000g\u0001\u0000\u0000\u0000\u0000i\u0001\u0000\u0000\u0000\u0000"+ - "k\u0001\u0000\u0000\u0000\u0000m\u0001\u0000\u0000\u0000\u0000o\u0001"+ - "\u0000\u0000\u0000\u0000q\u0001\u0000\u0000\u0000\u0000s\u0001\u0000\u0000"+ - "\u0000\u0000u\u0001\u0000\u0000\u0000\u0000w\u0001\u0000\u0000\u0000\u0000"+ - "y\u0001\u0000\u0000\u0000\u0000{\u0001\u0000\u0000\u0000\u0000}\u0001"+ - "\u0000\u0000\u0000\u0000\u007f\u0001\u0000\u0000\u0000\u0000\u0081\u0001"+ - "\u0000\u0000\u0000\u0000\u0083\u0001\u0000\u0000\u0000\u0000\u0085\u0001"+ - "\u0000\u0000\u0000\u0000\u0087\u0001\u0000\u0000\u0000\u0000\u0089\u0001"+ - "\u0000\u0000\u0000\u0000\u008b\u0001\u0000\u0000\u0000\u0000\u008d\u0001"+ - "\u0000\u0000\u0000\u0000\u008f\u0001\u0000\u0000\u0000\u0000\u0091\u0001"+ - "\u0000\u0000\u0000\u0000\u0093\u0001\u0000\u0000\u0000\u0000\u0095\u0001"+ - "\u0000\u0000\u0000\u0000\u0097\u0001\u0000\u0000\u0000\u0000\u0099\u0001"+ - "\u0000\u0000\u0000\u0000\u009b\u0001\u0000\u0000\u0000\u0000\u009d\u0001"+ - "\u0000\u0000\u0000\u0000\u009f\u0001\u0000\u0000\u0000\u0000\u00a1\u0001"+ - "\u0000\u0000\u0000\u0000\u00a3\u0001\u0000\u0000\u0000\u0000\u00a5\u0001"+ - "\u0000\u0000\u0000\u0000\u00a7\u0001\u0000\u0000\u0000\u0000\u00a9\u0001"+ - "\u0000\u0000\u0000\u0000\u00ab\u0001\u0000\u0000\u0000\u0000\u00ad\u0001"+ - "\u0000\u0000\u0000\u0000\u00af\u0001\u0000\u0000\u0000\u0000\u00b1\u0001"+ - "\u0000\u0000\u0000\u0000\u00b3\u0001\u0000\u0000\u0000\u0000\u00b5\u0001"+ - "\u0000\u0000\u0000\u0000\u00b7\u0001\u0000\u0000\u0000\u0000\u00b9\u0001"+ - "\u0000\u0000\u0000\u0000\u00bb\u0001\u0000\u0000\u0000\u0000\u00bd\u0001"+ - "\u0000\u0000\u0000\u0000\u00bf\u0001\u0000\u0000\u0000\u0000\u00c1\u0001"+ - "\u0000\u0000\u0000\u0000\u00c3\u0001\u0000\u0000\u0000\u0000\u00c5\u0001"+ - "\u0000\u0000\u0000\u0000\u00c7\u0001\u0000\u0000\u0000\u0000\u00c9\u0001"+ - "\u0000\u0000\u0000\u0000\u00cb\u0001\u0000\u0000\u0000\u0000\u00cd\u0001"+ - "\u0000\u0000\u0000\u0000\u00cf\u0001\u0000\u0000\u0000\u0000\u00d1\u0001"+ - "\u0000\u0000\u0000\u0000\u00d3\u0001\u0000\u0000\u0000\u0000\u00d5\u0001"+ - "\u0000\u0000\u0000\u0000\u00d7\u0001\u0000\u0000\u0000\u0000\u00d9\u0001"+ - "\u0000\u0000\u0000\u0000\u00db\u0001\u0000\u0000\u0000\u0000\u00dd\u0001"+ - "\u0000\u0000\u0000\u0000\u00df\u0001\u0000\u0000\u0000\u0000\u00e1\u0001"+ - "\u0000\u0000\u0000\u0000\u00e3\u0001\u0000\u0000\u0000\u0000\u00e5\u0001"+ - "\u0000\u0000\u0000\u0000\u00e7\u0001\u0000\u0000\u0000\u0001\u00e9\u0001"+ - "\u0000\u0000\u0000\u0003\u00ee\u0001\u0000\u0000\u0000\u0005\u00f0\u0001"+ - "\u0000\u0000\u0000\u0007\u00f3\u0001\u0000\u0000\u0000\t\u00f5\u0001\u0000"+ - "\u0000\u0000\u000b\u00f7\u0001\u0000\u0000\u0000\r\u00fa\u0001\u0000\u0000"+ - "\u0000\u000f\u00fe\u0001\u0000\u0000\u0000\u0011\u0100\u0001\u0000\u0000"+ - "\u0000\u0013\u0102\u0001\u0000\u0000\u0000\u0015\u0104\u0001\u0000\u0000"+ - "\u0000\u0017\u0106\u0001\u0000\u0000\u0000\u0019\u0108\u0001\u0000\u0000"+ - "\u0000\u001b\u010b\u0001\u0000\u0000\u0000\u001d\u0110\u0001\u0000\u0000"+ - "\u0000\u001f\u0118\u0001\u0000\u0000\u0000!\u011b\u0001\u0000\u0000\u0000"+ - "#\u0120\u0001\u0000\u0000\u0000%\u012a\u0001\u0000\u0000\u0000\'\u0135"+ - "\u0001\u0000\u0000\u0000)\u013b\u0001\u0000\u0000\u0000+\u0144\u0001\u0000"+ - "\u0000\u0000-\u014a\u0001\u0000\u0000\u0000/\u014e\u0001\u0000\u0000\u0000"+ - "1\u0152\u0001\u0000\u0000\u00003\u0155\u0001\u0000\u0000\u00005\u015c"+ - "\u0001\u0000\u0000\u00007\u0162\u0001\u0000\u0000\u00009\u016b\u0001\u0000"+ - "\u0000\u0000;\u0173\u0001\u0000\u0000\u0000=\u0178\u0001\u0000\u0000\u0000"+ - "?\u017b\u0001\u0000\u0000\u0000A\u0182\u0001\u0000\u0000\u0000C\u0188"+ - "\u0001\u0000\u0000\u0000E\u0193\u0001\u0000\u0000\u0000G\u019b\u0001\u0000"+ - "\u0000\u0000I\u01a5\u0001\u0000\u0000\u0000K\u01af\u0001\u0000\u0000\u0000"+ - "M\u01ba\u0001\u0000\u0000\u0000O\u01c6\u0001\u0000\u0000\u0000Q\u01d0"+ - "\u0001\u0000\u0000\u0000S\u01d9\u0001\u0000\u0000\u0000U\u01e1\u0001\u0000"+ - "\u0000\u0000W\u01ec\u0001\u0000\u0000\u0000Y\u01f4\u0001\u0000\u0000\u0000"+ - "[\u0200\u0001\u0000\u0000\u0000]\u020b\u0001\u0000\u0000\u0000_\u0214"+ - "\u0001\u0000\u0000\u0000a\u0218\u0001\u0000\u0000\u0000c\u021d\u0001\u0000"+ - "\u0000\u0000e\u0221\u0001\u0000\u0000\u0000g\u0226\u0001\u0000\u0000\u0000"+ - "i\u022c\u0001\u0000\u0000\u0000k\u0234\u0001\u0000\u0000\u0000m\u023d"+ - "\u0001\u0000\u0000\u0000o\u0247\u0001\u0000\u0000\u0000q\u024e\u0001\u0000"+ - "\u0000\u0000s\u0254\u0001\u0000\u0000\u0000u\u0259\u0001\u0000\u0000\u0000"+ - "w\u025d\u0001\u0000\u0000\u0000y\u0262\u0001\u0000\u0000\u0000{\u026b"+ - "\u0001\u0000\u0000\u0000}\u0273\u0001\u0000\u0000\u0000\u007f\u0276\u0001"+ - "\u0000\u0000\u0000\u0081\u0281\u0001\u0000\u0000\u0000\u0083\u0289\u0001"+ - "\u0000\u0000\u0000\u0085\u0290\u0001\u0000\u0000\u0000\u0087\u0293\u0001"+ - "\u0000\u0000\u0000\u0089\u0299\u0001\u0000\u0000\u0000\u008b\u02a5\u0001"+ - "\u0000\u0000\u0000\u008d\u02a9\u0001\u0000\u0000\u0000\u008f\u02b1\u0001"+ - "\u0000\u0000\u0000\u0091\u02bb\u0001\u0000\u0000\u0000\u0093\u02c2\u0001"+ - "\u0000\u0000\u0000\u0095\u02cb\u0001\u0000\u0000\u0000\u0097\u02d2\u0001"+ - "\u0000\u0000\u0000\u0099\u02dc\u0001\u0000\u0000\u0000\u009b\u02e5\u0001"+ - "\u0000\u0000\u0000\u009d\u02f2\u0001\u0000\u0000\u0000\u009f\u02fc\u0001"+ - "\u0000\u0000\u0000\u00a1\u0306\u0001\u0000\u0000\u0000\u00a3\u030a\u0001"+ - "\u0000\u0000\u0000\u00a5\u030f\u0001\u0000\u0000\u0000\u00a7\u0312\u0001"+ - "\u0000\u0000\u0000\u00a9\u0315\u0001\u0000\u0000\u0000\u00ab\u031d\u0001"+ - "\u0000\u0000\u0000\u00ad\u0321\u0001\u0000\u0000\u0000\u00af\u0329\u0001"+ - "\u0000\u0000\u0000\u00b1\u0331\u0001\u0000\u0000\u0000\u00b3\u033b\u0001"+ - "\u0000\u0000\u0000\u00b5\u0343\u0001\u0000\u0000\u0000\u00b7\u034d\u0001"+ - "\u0000\u0000\u0000\u00b9\u0354\u0001\u0000\u0000\u0000\u00bb\u035d\u0001"+ - "\u0000\u0000\u0000\u00bd\u0367\u0001\u0000\u0000\u0000\u00bf\u0374\u0001"+ - "\u0000\u0000\u0000\u00c1\u037f\u0001\u0000\u0000\u0000\u00c3\u0383\u0001"+ - "\u0000\u0000\u0000\u00c5\u038a\u0001\u0000\u0000\u0000\u00c7\u0399\u0001"+ - "\u0000\u0000\u0000\u00c9\u03a5\u0001\u0000\u0000\u0000\u00cb\u03aa\u0001"+ - "\u0000\u0000\u0000\u00cd\u03b1\u0001\u0000\u0000\u0000\u00cf\u03bf\u0001"+ - "\u0000\u0000\u0000\u00d1\u03c6\u0001\u0000\u0000\u0000\u00d3\u03ce\u0001"+ - "\u0000\u0000\u0000\u00d5\u03d6\u0001\u0000\u0000\u0000\u00d7\u03e1\u0001"+ - "\u0000\u0000\u0000\u00d9\u03e6\u0001\u0000\u0000\u0000\u00db\u03e9\u0001"+ - "\u0000\u0000\u0000\u00dd\u03ee\u0001\u0000\u0000\u0000\u00df\u03f3\u0001"+ - "\u0000\u0000\u0000\u00e1\u03f9\u0001\u0000\u0000\u0000\u00e3\u0400\u0001"+ - "\u0000\u0000\u0000\u00e5\u0407\u0001\u0000\u0000\u0000\u00e7\u040b\u0001"+ - "\u0000\u0000\u0000\u00e9\u00ea\u0005r\u0000\u0000\u00ea\u00eb\u0005e\u0000"+ - "\u0000\u00eb\u00ec\u0005f\u0000\u0000\u00ec\u00ed\u0005 \u0000\u0000\u00ed"+ - "\u0002\u0001\u0000\u0000\u0000\u00ee\u00ef\u0005[\u0000\u0000\u00ef\u0004"+ - "\u0001\u0000\u0000\u0000\u00f0\u00f1\u0005.\u0000\u0000\u00f1\u00f2\u0005"+ - ".\u0000\u0000\u00f2\u0006\u0001\u0000\u0000\u0000\u00f3\u00f4\u0005]\u0000"+ - "\u0000\u00f4\b\u0001\u0000\u0000\u0000\u00f5\u00f6\u0005*\u0000\u0000"+ - "\u00f6\n\u0001\u0000\u0000\u0000\u00f7\u00f8\u0005:\u0000\u0000\u00f8"+ - "\u00f9\u0005>\u0000\u0000\u00f9\f\u0001\u0000\u0000\u0000\u00fa\u00fb"+ - "\u0005:\u0000\u0000\u00fb\u00fc\u0005>\u0000\u0000\u00fc\u00fd\u0005>"+ - "\u0000\u0000\u00fd\u000e\u0001\u0000\u0000\u0000\u00fe\u00ff\u0005:\u0000"+ - "\u0000\u00ff\u0010\u0001\u0000\u0000\u0000\u0100\u0101\u0005=\u0000\u0000"+ - "\u0101\u0012\u0001\u0000\u0000\u0000\u0102\u0103\u0005|\u0000\u0000\u0103"+ - "\u0014\u0001\u0000\u0000\u0000\u0104\u0105\u0005/\u0000\u0000\u0105\u0016"+ - "\u0001\u0000\u0000\u0000\u0106\u0107\u0005,\u0000\u0000\u0107\u0018\u0001"+ - "\u0000\u0000\u0000\u0108\u0109\u0005:\u0000\u0000\u0109\u010a\u0005:\u0000"+ - "\u0000\u010a\u001a\u0001\u0000\u0000\u0000\u010b\u010c\u0005:\u0000\u0000"+ - "\u010c\u010d\u0005:\u0000\u0000\u010d\u010e\u0005>\u0000\u0000\u010e\u001c"+ - "\u0001\u0000\u0000\u0000\u010f\u0111\u0007\u0000\u0000\u0000\u0110\u010f"+ - "\u0001\u0000\u0000\u0000\u0111\u0112\u0001\u0000\u0000\u0000\u0112\u0110"+ - "\u0001\u0000\u0000\u0000\u0112\u0113\u0001\u0000\u0000\u0000\u0113\u0114"+ - "\u0001\u0000\u0000\u0000\u0114\u0115\u0006\u000e\u0000\u0000\u0115\u001e"+ - "\u0001\u0000\u0000\u0000\u0116\u0119\u0003\u00dbm\u0000\u0117\u0119\u0003"+ - "g3\u0000\u0118\u0116\u0001\u0000\u0000\u0000\u0118\u0117\u0001\u0000\u0000"+ - "\u0000\u0119 \u0001\u0000\u0000\u0000\u011a\u011c\u0007\u0001\u0000\u0000"+ - "\u011b\u011a\u0001\u0000\u0000\u0000\u011c\u011d\u0001\u0000\u0000\u0000"+ - "\u011d\u011b\u0001\u0000\u0000\u0000\u011d\u011e\u0001\u0000\u0000\u0000"+ - "\u011e\"\u0001\u0000\u0000\u0000\u011f\u0121\u0007\u0001\u0000\u0000\u0120"+ - "\u011f\u0001\u0000\u0000\u0000\u0121\u0122\u0001\u0000\u0000\u0000\u0122"+ - "\u0120\u0001\u0000\u0000\u0000\u0122\u0123\u0001\u0000\u0000\u0000\u0123"+ - "\u0124\u0001\u0000\u0000\u0000\u0124\u0126\u0005.\u0000\u0000\u0125\u0127"+ - "\u0007\u0001\u0000\u0000\u0126\u0125\u0001\u0000\u0000\u0000\u0127\u0128"+ - "\u0001\u0000\u0000\u0000\u0128\u0126\u0001\u0000\u0000\u0000\u0128\u0129"+ - "\u0001\u0000\u0000\u0000\u0129$\u0001\u0000\u0000\u0000\u012a\u0130\u0005"+ - "\"\u0000\u0000\u012b\u012f\b\u0002\u0000\u0000\u012c\u012d\u0005\"\u0000"+ - "\u0000\u012d\u012f\u0005\"\u0000\u0000\u012e\u012b\u0001\u0000\u0000\u0000"+ - "\u012e\u012c\u0001\u0000\u0000\u0000\u012f\u0132\u0001\u0000\u0000\u0000"+ - "\u0130\u012e\u0001\u0000\u0000\u0000\u0130\u0131\u0001\u0000\u0000\u0000"+ - "\u0131\u0133\u0001\u0000\u0000\u0000\u0132\u0130\u0001\u0000\u0000\u0000"+ - "\u0133\u0134\u0005\"\u0000\u0000\u0134&\u0001\u0000\u0000\u0000\u0135"+ - "\u0136\u0005a\u0000\u0000\u0136\u0137\u0005b\u0000\u0000\u0137\u0138\u0005"+ - "o\u0000\u0000\u0138\u0139\u0005u\u0000\u0000\u0139\u013a\u0005t\u0000"+ - "\u0000\u013a(\u0001\u0000\u0000\u0000\u013b\u013c\u0005a\u0000\u0000\u013c"+ - "\u013d\u0005b\u0000\u0000\u013d\u013e\u0005s\u0000\u0000\u013e\u013f\u0005"+ - "t\u0000\u0000\u013f\u0140\u0005r\u0000\u0000\u0140\u0141\u0005a\u0000"+ - "\u0000\u0141\u0142\u0005c\u0000\u0000\u0142\u0143\u0005t\u0000\u0000\u0143"+ - "*\u0001\u0000\u0000\u0000\u0144\u0145\u0005a\u0000\u0000\u0145\u0146\u0005"+ - "l\u0000\u0000\u0146\u0147\u0005i\u0000\u0000\u0147\u0148\u0005a\u0000"+ - "\u0000\u0148\u0149\u0005s\u0000\u0000\u0149,\u0001\u0000\u0000\u0000\u014a"+ - "\u014b\u0005a\u0000\u0000\u014b\u014c\u0005l\u0000\u0000\u014c\u014d\u0005"+ - "l\u0000\u0000\u014d.\u0001\u0000\u0000\u0000\u014e\u014f\u0005a\u0000"+ - "\u0000\u014f\u0150\u0005n\u0000\u0000\u0150\u0151\u0005d\u0000\u0000\u0151"+ - "0\u0001\u0000\u0000\u0000\u0152\u0153\u0005a\u0000\u0000\u0153\u0154\u0005"+ - "s\u0000\u0000\u01542\u0001\u0000\u0000\u0000\u0155\u0156\u0005a\u0000"+ - "\u0000\u0156\u0157\u0005s\u0000\u0000\u0157\u0158\u0005s\u0000\u0000\u0158"+ - "\u0159\u0005i\u0000\u0000\u0159\u015a\u0005g\u0000\u0000\u015a\u015b\u0005"+ - "n\u0000\u0000\u015b4\u0001\u0000\u0000\u0000\u015c\u015d\u0005a\u0000"+ - "\u0000\u015d\u015e\u0005s\u0000\u0000\u015e\u015f\u0005s\u0000\u0000\u015f"+ - "\u0160\u0005o\u0000\u0000\u0160\u0161\u0005c\u0000\u0000\u01616\u0001"+ - "\u0000\u0000\u0000\u0162\u0163\u0005b\u0000\u0000\u0163\u0164\u0005e\u0000"+ - "\u0000\u0164\u0165\u0005h\u0000\u0000\u0165\u0166\u0005a\u0000\u0000\u0166"+ - "\u0167\u0005v\u0000\u0000\u0167\u0168\u0005i\u0000\u0000\u0168\u0169\u0005"+ - "o\u0000\u0000\u0169\u016a\u0005r\u0000\u0000\u016a8\u0001\u0000\u0000"+ - "\u0000\u016b\u016c\u0005b\u0000\u0000\u016c\u016d\u0005i\u0000\u0000\u016d"+ - "\u016e\u0005n\u0000\u0000\u016e\u016f\u0005d\u0000\u0000\u016f\u0170\u0005"+ - "i\u0000\u0000\u0170\u0171\u0005n\u0000\u0000\u0171\u0172\u0005g\u0000"+ - "\u0000\u0172:\u0001\u0000\u0000\u0000\u0173\u0174\u0005b\u0000\u0000\u0174"+ - "\u0175\u0005o\u0000\u0000\u0175\u0176\u0005o\u0000\u0000\u0176\u0177\u0005"+ - "l\u0000\u0000\u0177<\u0001\u0000\u0000\u0000\u0178\u0179\u0005b\u0000"+ - "\u0000\u0179\u017a\u0005y\u0000\u0000\u017a>\u0001\u0000\u0000\u0000\u017b"+ - "\u017c\u0005c\u0000\u0000\u017c\u017d\u0005h\u0000\u0000\u017d\u017e\u0005"+ - "a\u0000\u0000\u017e\u017f\u0005i\u0000\u0000\u017f\u0180\u0005n\u0000"+ - "\u0000\u0180\u0181\u0005s\u0000\u0000\u0181@\u0001\u0000\u0000\u0000\u0182"+ - "\u0183\u0005c\u0000\u0000\u0183\u0184\u0005l\u0000\u0000\u0184\u0185\u0005"+ - "a\u0000\u0000\u0185\u0186\u0005s\u0000\u0000\u0186\u0187\u0005s\u0000"+ - "\u0000\u0187B\u0001\u0000\u0000\u0000\u0188\u0189\u0005c\u0000\u0000\u0189"+ - "\u018a\u0005l\u0000\u0000\u018a\u018b\u0005a\u0000\u0000\u018b\u018c\u0005"+ - "s\u0000\u0000\u018c\u018d\u0005s\u0000\u0000\u018d\u018e\u0005i\u0000"+ - "\u0000\u018e\u018f\u0005f\u0000\u0000\u018f\u0190\u0005i\u0000\u0000\u0190"+ - "\u0191\u0005e\u0000\u0000\u0191\u0192\u0005r\u0000\u0000\u0192D\u0001"+ - "\u0000\u0000\u0000\u0193\u0194\u0005c\u0000\u0000\u0194\u0195\u0005o\u0000"+ - "\u0000\u0195\u0196\u0005m\u0000\u0000\u0196\u0197\u0005m\u0000\u0000\u0197"+ - "\u0198\u0005e\u0000\u0000\u0198\u0199\u0005n\u0000\u0000\u0199\u019a\u0005"+ - "t\u0000\u0000\u019aF\u0001\u0000\u0000\u0000\u019b\u019c\u0005c\u0000"+ - "\u0000\u019c\u019d\u0005o\u0000\u0000\u019d\u019e\u0005m\u0000\u0000\u019e"+ - "\u019f\u0005p\u0000\u0000\u019f\u01a0\u0005o\u0000\u0000\u01a0\u01a1\u0005"+ - "s\u0000\u0000\u01a1\u01a2\u0005i\u0000\u0000\u01a2\u01a3\u0005t\u0000"+ - "\u0000\u01a3\u01a4\u0005e\u0000\u0000\u01a4H\u0001\u0000\u0000\u0000\u01a5"+ - "\u01a6\u0005c\u0000\u0000\u01a6\u01a7\u0005o\u0000\u0000\u01a7\u01a8\u0005"+ - "n\u0000\u0000\u01a8\u01a9\u0005j\u0000\u0000\u01a9\u01aa\u0005u\u0000"+ - "\u0000\u01aa\u01ab\u0005g\u0000\u0000\u01ab\u01ac\u0005a\u0000\u0000\u01ac"+ - "\u01ad\u0005t\u0000\u0000\u01ad\u01ae\u0005e\u0000\u0000\u01aeJ\u0001"+ - "\u0000\u0000\u0000\u01af\u01b0\u0005c\u0000\u0000\u01b0\u01b1\u0005o\u0000"+ - "\u0000\u01b1\u01b2\u0005n\u0000\u0000\u01b2\u01b3\u0005j\u0000\u0000\u01b3"+ - "\u01b4\u0005u\u0000\u0000\u01b4\u01b5\u0005g\u0000\u0000\u01b5\u01b6\u0005"+ - "a\u0000\u0000\u01b6\u01b7\u0005t\u0000\u0000\u01b7\u01b8\u0005e\u0000"+ - "\u0000\u01b8\u01b9\u0005s\u0000\u0000\u01b9L\u0001\u0000\u0000\u0000\u01ba"+ - "\u01bb\u0005c\u0000\u0000\u01bb\u01bc\u0005o\u0000\u0000\u01bc\u01bd\u0005"+ - "n\u0000\u0000\u01bd\u01be\u0005j\u0000\u0000\u01be\u01bf\u0005u\u0000"+ - "\u0000\u01bf\u01c0\u0005g\u0000\u0000\u01c0\u01c1\u0005a\u0000\u0000\u01c1"+ - "\u01c2\u0005t\u0000\u0000\u01c2\u01c3\u0005i\u0000\u0000\u01c3\u01c4\u0005"+ - "o\u0000\u0000\u01c4\u01c5\u0005n\u0000\u0000\u01c5N\u0001\u0000\u0000"+ - "\u0000\u01c6\u01c7\u0005c\u0000\u0000\u01c7\u01c8\u0005o\u0000\u0000\u01c8"+ - "\u01c9\u0005n\u0000\u0000\u01c9\u01ca\u0005n\u0000\u0000\u01ca\u01cb\u0005"+ - "e\u0000\u0000\u01cb\u01cc\u0005c\u0000\u0000\u01cc\u01cd\u0005t\u0000"+ - "\u0000\u01cd\u01ce\u0005o\u0000\u0000\u01ce\u01cf\u0005r\u0000\u0000\u01cf"+ - "P\u0001\u0000\u0000\u0000\u01d0\u01d1\u0005d\u0000\u0000\u01d1\u01d2\u0005"+ - "a\u0000\u0000\u01d2\u01d3\u0005t\u0000\u0000\u01d3\u01d4\u0005a\u0000"+ - "\u0000\u01d4\u01d5\u0005t\u0000\u0000\u01d5\u01d6\u0005y\u0000\u0000\u01d6"+ - "\u01d7\u0005p\u0000\u0000\u01d7\u01d8\u0005e\u0000\u0000\u01d8R\u0001"+ - "\u0000\u0000\u0000\u01d9\u01da\u0005d\u0000\u0000\u01da\u01db\u0005e\u0000"+ - "\u0000\u01db\u01dc\u0005f\u0000\u0000\u01dc\u01dd\u0005a\u0000\u0000\u01dd"+ - "\u01de\u0005u\u0000\u0000\u01de\u01df\u0005l\u0000\u0000\u01df\u01e0\u0005"+ - "t\u0000\u0000\u01e0T\u0001\u0000\u0000\u0000\u01e1\u01e2\u0005d\u0000"+ - "\u0000\u01e2\u01e3\u0005e\u0000\u0000\u01e3\u01e4\u0005p\u0000\u0000\u01e4"+ - "\u01e5\u0005e\u0000\u0000\u01e5\u01e6\u0005n\u0000\u0000\u01e6\u01e7\u0005"+ - "d\u0000\u0000\u01e7\u01e8\u0005e\u0000\u0000\u01e8\u01e9\u0005n\u0000"+ - "\u0000\u01e9\u01ea\u0005c\u0000\u0000\u01ea\u01eb\u0005y\u0000\u0000\u01eb"+ - "V\u0001\u0000\u0000\u0000\u01ec\u01ed\u0005d\u0000\u0000\u01ed\u01ee\u0005"+ - "e\u0000\u0000\u01ee\u01ef\u0005r\u0000\u0000\u01ef\u01f0\u0005i\u0000"+ - "\u0000\u01f0\u01f1\u0005v\u0000\u0000\u01f1\u01f2\u0005e\u0000\u0000\u01f2"+ - "\u01f3\u0005d\u0000\u0000\u01f3X\u0001\u0000\u0000\u0000\u01f4\u01f5\u0005"+ - "d\u0000\u0000\u01f5\u01f6\u0005i\u0000\u0000\u01f6\u01f7\u0005f\u0000"+ - "\u0000\u01f7\u01f8\u0005f\u0000\u0000\u01f8\u01f9\u0005e\u0000\u0000\u01f9"+ - "\u01fa\u0005r\u0000\u0000\u01fa\u01fb\u0005e\u0000\u0000\u01fb\u01fc\u0005"+ - "n\u0000\u0000\u01fc\u01fd\u0005c\u0000\u0000\u01fd\u01fe\u0005e\u0000"+ - "\u0000\u01fe\u01ff\u0005s\u0000\u0000\u01ffZ\u0001\u0000\u0000\u0000\u0200"+ - "\u0201\u0005d\u0000\u0000\u0201\u0202\u0005i\u0000\u0000\u0202\u0203\u0005"+ - "s\u0000\u0000\u0203\u0204\u0005j\u0000\u0000\u0204\u0205\u0005o\u0000"+ - "\u0000\u0205\u0206\u0005i\u0000\u0000\u0206\u0207\u0005n\u0000\u0000\u0207"+ - "\u0208\u0005i\u0000\u0000\u0208\u0209\u0005n\u0000\u0000\u0209\u020a\u0005"+ - "g\u0000\u0000\u020a\\\u0001\u0000\u0000\u0000\u020b\u020c\u0005d\u0000"+ - "\u0000\u020c\u020d\u0005i\u0000\u0000\u020d\u020e\u0005s\u0000\u0000\u020e"+ - "\u020f\u0005j\u0000\u0000\u020f\u0210\u0005o\u0000\u0000\u0210\u0211\u0005"+ - "i\u0000\u0000\u0211\u0212\u0005n\u0000\u0000\u0212\u0213\u0005t\u0000"+ - "\u0000\u0213^\u0001\u0000\u0000\u0000\u0214\u0215\u0005d\u0000\u0000\u0215"+ - "\u0216\u0005o\u0000\u0000\u0216\u0217\u0005c\u0000\u0000\u0217`\u0001"+ - "\u0000\u0000\u0000\u0218\u0219\u0005e\u0000\u0000\u0219\u021a\u0005l\u0000"+ - "\u0000\u021a\u021b\u0005s\u0000\u0000\u021b\u021c\u0005e\u0000\u0000\u021c"+ - "b\u0001\u0000\u0000\u0000\u021d\u021e\u0005e\u0000\u0000\u021e\u021f\u0005"+ - "n\u0000\u0000\u021f\u0220\u0005d\u0000\u0000\u0220d\u0001\u0000\u0000"+ - "\u0000\u0221\u0222\u0005e\u0000\u0000\u0222\u0223\u0005x\u0000\u0000\u0223"+ - "\u0224\u0005p\u0000\u0000\u0224\u0225\u0005r\u0000\u0000\u0225f\u0001"+ - "\u0000\u0000\u0000\u0226\u0227\u0005f\u0000\u0000\u0227\u0228\u0005a\u0000"+ - "\u0000\u0228\u0229\u0005l\u0000\u0000\u0229\u022a\u0005s\u0000\u0000\u022a"+ - "\u022b\u0005e\u0000\u0000\u022bh\u0001\u0000\u0000\u0000\u022c\u022d\u0005"+ - "f\u0000\u0000\u022d\u022e\u0005e\u0000\u0000\u022e\u022f\u0005a\u0000"+ - "\u0000\u022f\u0230\u0005t\u0000\u0000\u0230\u0231\u0005u\u0000\u0000\u0231"+ - "\u0232\u0005r\u0000\u0000\u0232\u0233\u0005e\u0000\u0000\u0233j\u0001"+ - "\u0000\u0000\u0000\u0234\u0235\u0005f\u0000\u0000\u0235\u0236\u0005e\u0000"+ - "\u0000\u0236\u0237\u0005a\u0000\u0000\u0237\u0238\u0005t\u0000\u0000\u0238"+ - "\u0239\u0005u\u0000\u0000\u0239\u023a\u0005r\u0000\u0000\u023a\u023b\u0005"+ - "e\u0000\u0000\u023b\u023c\u0005d\u0000\u0000\u023cl\u0001\u0000\u0000"+ - "\u0000\u023d\u023e\u0005f\u0000\u0000\u023e\u023f\u0005e\u0000\u0000\u023f"+ - "\u0240\u0005a\u0000\u0000\u0240\u0241\u0005t\u0000\u0000\u0241\u0242\u0005"+ - "u\u0000\u0000\u0242\u0243\u0005r\u0000\u0000\u0243\u0244\u0005i\u0000"+ - "\u0000\u0244\u0245\u0005n\u0000\u0000\u0245\u0246\u0005g\u0000\u0000\u0246"+ - "n\u0001\u0000\u0000\u0000\u0247\u0248\u0005f\u0000\u0000\u0248\u0249\u0005"+ - "i\u0000\u0000\u0249\u024a\u0005l\u0000\u0000\u024a\u024b\u0005t\u0000"+ - "\u0000\u024b\u024c\u0005e\u0000\u0000\u024c\u024d\u0005r\u0000\u0000\u024d"+ - "p\u0001\u0000\u0000\u0000\u024e\u024f\u0005f\u0000\u0000\u024f\u0250\u0005"+ - "i\u0000\u0000\u0250\u0251\u0005r\u0000\u0000\u0251\u0252\u0005s\u0000"+ - "\u0000\u0252\u0253\u0005t\u0000\u0000\u0253r\u0001\u0000\u0000\u0000\u0254"+ - "\u0255\u0005f\u0000\u0000\u0255\u0256\u0005l\u0000\u0000\u0256\u0257\u0005"+ - "o\u0000\u0000\u0257\u0258\u0005w\u0000\u0000\u0258t\u0001\u0000\u0000"+ - "\u0000\u0259\u025a\u0005f\u0000\u0000\u025a\u025b\u0005o\u0000\u0000\u025b"+ - "\u025c\u0005r\u0000\u0000\u025cv\u0001\u0000\u0000\u0000\u025d\u025e\u0005"+ - "f\u0000\u0000\u025e\u025f\u0005r\u0000\u0000\u025f\u0260\u0005o\u0000"+ - "\u0000\u0260\u0261\u0005m\u0000\u0000\u0261x\u0001\u0000\u0000\u0000\u0262"+ - "\u0263\u0005f\u0000\u0000\u0263\u0264\u0005u\u0000\u0000\u0264\u0265\u0005"+ - "n\u0000\u0000\u0265\u0266\u0005c\u0000\u0000\u0266\u0267\u0005t\u0000"+ - "\u0000\u0267\u0268\u0005i\u0000\u0000\u0268\u0269\u0005o\u0000\u0000\u0269"+ - "\u026a\u0005n\u0000\u0000\u026az\u0001\u0000\u0000\u0000\u026b\u026c\u0005"+ - "h\u0000\u0000\u026c\u026d\u0005a\u0000\u0000\u026d\u026e\u0005s\u0000"+ - "\u0000\u026e\u026f\u0005t\u0000\u0000\u026f\u0270\u0005y\u0000\u0000\u0270"+ - "\u0271\u0005p\u0000\u0000\u0271\u0272\u0005e\u0000\u0000\u0272|\u0001"+ - "\u0000\u0000\u0000\u0273\u0274\u0005i\u0000\u0000\u0274\u0275\u0005f\u0000"+ - "\u0000\u0275~\u0001\u0000\u0000\u0000\u0276\u0277\u0005i\u0000\u0000\u0277"+ - "\u0278\u0005n\u0000\u0000\u0278\u0279\u0005t\u0000\u0000\u0279\u027a\u0005"+ - "e\u0000\u0000\u027a\u027b\u0005r\u0000\u0000\u027b\u027c\u0005s\u0000"+ - "\u0000\u027c\u027d\u0005e\u0000\u0000\u027d\u027e\u0005c\u0000\u0000\u027e"+ - "\u027f\u0005t\u0000\u0000\u027f\u0280\u0005s\u0000\u0000\u0280\u0080\u0001"+ - "\u0000\u0000\u0000\u0281\u0282\u0005i\u0000\u0000\u0282\u0283\u0005m\u0000"+ - "\u0000\u0283\u0284\u0005p\u0000\u0000\u0284\u0285\u0005l\u0000\u0000\u0285"+ - "\u0286\u0005i\u0000\u0000\u0286\u0287\u0005e\u0000\u0000\u0287\u0288\u0005"+ - "s\u0000\u0000\u0288\u0082\u0001\u0000\u0000\u0000\u0289\u028a\u0005i\u0000"+ - "\u0000\u028a\u028b\u0005m\u0000\u0000\u028b\u028c\u0005p\u0000\u0000\u028c"+ - "\u028d\u0005o\u0000\u0000\u028d\u028e\u0005r\u0000\u0000\u028e\u028f\u0005"+ - "t\u0000\u0000\u028f\u0084\u0001\u0000\u0000\u0000\u0290\u0291\u0005i\u0000"+ - "\u0000\u0291\u0292\u0005n\u0000\u0000\u0292\u0086\u0001\u0000\u0000\u0000"+ - "\u0293\u0294\u0005i\u0000\u0000\u0294\u0295\u0005n\u0000\u0000\u0295\u0296"+ - "\u0005o\u0000\u0000\u0296\u0297\u0005u\u0000\u0000\u0297\u0298\u0005t"+ - "\u0000\u0000\u0298\u0088\u0001\u0000\u0000\u0000\u0299\u029a\u0005i\u0000"+ - "\u0000\u029a\u029b\u0005n\u0000\u0000\u029b\u029c\u0005t\u0000\u0000\u029c"+ - "\u029d\u0005e\u0000\u0000\u029d\u029e\u0005r\u0000\u0000\u029e\u029f\u0005"+ - "a\u0000\u0000\u029f\u02a0\u0005c\u0000\u0000\u02a0\u02a1\u0005t\u0000"+ - "\u0000\u02a1\u02a2\u0005i\u0000\u0000\u02a2\u02a3\u0005o\u0000\u0000\u02a3"+ - "\u02a4\u0005n\u0000\u0000\u02a4\u008a\u0001\u0000\u0000\u0000\u02a5\u02a6"+ - "\u0005i\u0000\u0000\u02a6\u02a7\u0005n\u0000\u0000\u02a7\u02a8\u0005v"+ - "\u0000\u0000\u02a8\u008c\u0001\u0000\u0000\u0000\u02a9\u02aa\u0005i\u0000"+ - "\u0000\u02aa\u02ab\u0005n\u0000\u0000\u02ab\u02ac\u0005v\u0000\u0000\u02ac"+ - "\u02ad\u0005e\u0000\u0000\u02ad\u02ae\u0005r\u0000\u0000\u02ae\u02af\u0005"+ - "s\u0000\u0000\u02af\u02b0\u0005e\u0000\u0000\u02b0\u008e\u0001\u0000\u0000"+ - "\u0000\u02b1\u02b2\u0005i\u0000\u0000\u02b2\u02b3\u0005n\u0000\u0000\u02b3"+ - "\u02b4\u0005v\u0000\u0000\u02b4\u02b5\u0005e\u0000\u0000\u02b5\u02b6\u0005"+ - "r\u0000\u0000\u02b6\u02b7\u0005t\u0000\u0000\u02b7\u02b8\u0005i\u0000"+ - "\u0000\u02b8\u02b9\u0005n\u0000\u0000\u02b9\u02ba\u0005g\u0000\u0000\u02ba"+ - "\u0090\u0001\u0000\u0000\u0000\u02bb\u02bc\u0005i\u0000\u0000\u02bc\u02bd"+ - "\u0005s\u0000\u0000\u02bd\u02be\u0005t\u0000\u0000\u02be\u02bf\u0005y"+ - "\u0000\u0000\u02bf\u02c0\u0005p\u0000\u0000\u02c0\u02c1\u0005e\u0000\u0000"+ - "\u02c1\u0092\u0001\u0000\u0000\u0000\u02c2\u02c3\u0005l\u0000\u0000\u02c3"+ - "\u02c4\u0005a\u0000\u0000\u02c4\u02c5\u0005n\u0000\u0000\u02c5\u02c6\u0005"+ - "g\u0000\u0000\u02c6\u02c7\u0005u\u0000\u0000\u02c7\u02c8\u0005a\u0000"+ - "\u0000\u02c8\u02c9\u0005g\u0000\u0000\u02c9\u02ca\u0005e\u0000\u0000\u02ca"+ - "\u0094\u0001\u0000\u0000\u0000\u02cb\u02cc\u0005m\u0000\u0000\u02cc\u02cd"+ - "\u0005e\u0000\u0000\u02cd\u02ce\u0005m\u0000\u0000\u02ce\u02cf\u0005b"+ - "\u0000\u0000\u02cf\u02d0\u0005e\u0000\u0000\u02d0\u02d1\u0005r\u0000\u0000"+ - "\u02d1\u0096\u0001\u0000\u0000\u0000\u02d2\u02d3\u0005m\u0000\u0000\u02d3"+ - "\u02d4\u0005e\u0000\u0000\u02d4\u02d5\u0005t\u0000\u0000\u02d5\u02d6\u0005"+ - "a\u0000\u0000\u02d6\u02d7\u0005c\u0000\u0000\u02d7\u02d8\u0005l\u0000"+ - "\u0000\u02d8\u02d9\u0005a\u0000\u0000\u02d9\u02da\u0005s\u0000\u0000\u02da"+ - "\u02db\u0005s\u0000\u0000\u02db\u0098\u0001\u0000\u0000\u0000\u02dc\u02dd"+ - "\u0005m\u0000\u0000\u02dd\u02de\u0005e\u0000\u0000\u02de\u02df\u0005t"+ - "\u0000\u0000\u02df\u02e0\u0005a\u0000\u0000\u02e0\u02e1\u0005d\u0000\u0000"+ - "\u02e1\u02e2\u0005a\u0000\u0000\u02e2\u02e3\u0005t\u0000\u0000\u02e3\u02e4"+ - "\u0005a\u0000\u0000\u02e4\u009a\u0001\u0000\u0000\u0000\u02e5\u02e6\u0005"+ - "m\u0000\u0000\u02e6\u02e7\u0005u\u0000\u0000\u02e7\u02e8\u0005l\u0000"+ - "\u0000\u02e8\u02e9\u0005t\u0000\u0000\u02e9\u02ea\u0005i\u0000\u0000\u02ea"+ - "\u02eb\u0005p\u0000\u0000\u02eb\u02ec\u0005l\u0000\u0000\u02ec\u02ed\u0005"+ - "i\u0000\u0000\u02ed\u02ee\u0005c\u0000\u0000\u02ee\u02ef\u0005i\u0000"+ - "\u0000\u02ef\u02f0\u0005t\u0000\u0000\u02f0\u02f1\u0005y\u0000\u0000\u02f1"+ - "\u009c\u0001\u0000\u0000\u0000\u02f2\u02f3\u0005n\u0000\u0000\u02f3\u02f4"+ - "\u0005a\u0000\u0000\u02f4\u02f5\u0005m\u0000\u0000\u02f5\u02f6\u0005e"+ - "\u0000\u0000\u02f6\u02f7\u0005s\u0000\u0000\u02f7\u02f8\u0005p\u0000\u0000"+ - "\u02f8\u02f9\u0005a\u0000\u0000\u02f9\u02fa\u0005c\u0000\u0000\u02fa\u02fb"+ - "\u0005e\u0000\u0000\u02fb\u009e\u0001\u0000\u0000\u0000\u02fc\u02fd\u0005"+ - "n\u0000\u0000\u02fd\u02fe\u0005o\u0000\u0000\u02fe\u02ff\u0005n\u0000"+ - "\u0000\u02ff\u0300\u0005u\u0000\u0000\u0300\u0301\u0005n\u0000\u0000\u0301"+ - "\u0302\u0005i\u0000\u0000\u0302\u0303\u0005q\u0000\u0000\u0303\u0304\u0005"+ - "u\u0000\u0000\u0304\u0305\u0005e\u0000\u0000\u0305\u00a0\u0001\u0000\u0000"+ - "\u0000\u0306\u0307\u0005n\u0000\u0000\u0307\u0308\u0005o\u0000\u0000\u0308"+ - "\u0309\u0005t\u0000\u0000\u0309\u00a2\u0001\u0000\u0000\u0000\u030a\u030b"+ - "\u0005n\u0000\u0000\u030b\u030c\u0005u\u0000\u0000\u030c\u030d\u0005l"+ - "\u0000\u0000\u030d\u030e\u0005l\u0000\u0000\u030e\u00a4\u0001\u0000\u0000"+ - "\u0000\u030f\u0310\u0005o\u0000\u0000\u0310\u0311\u0005f\u0000\u0000\u0311"+ - "\u00a6\u0001\u0000\u0000\u0000\u0312\u0313\u0005o\u0000\u0000\u0313\u0314"+ - "\u0005r\u0000\u0000\u0314\u00a8\u0001\u0000\u0000\u0000\u0315\u0316\u0005"+ - "o\u0000\u0000\u0316\u0317\u0005r\u0000\u0000\u0317\u0318\u0005d\u0000"+ - "\u0000\u0318\u0319\u0005e\u0000\u0000\u0319\u031a\u0005r\u0000\u0000\u031a"+ - "\u031b\u0005e\u0000\u0000\u031b\u031c\u0005d\u0000\u0000\u031c\u00aa\u0001"+ - "\u0000\u0000\u0000\u031d\u031e\u0005o\u0000\u0000\u031e\u031f\u0005u\u0000"+ - "\u0000\u031f\u0320\u0005t\u0000\u0000\u0320\u00ac\u0001\u0000\u0000\u0000"+ - "\u0321\u0322\u0005p\u0000\u0000\u0322\u0323\u0005a\u0000\u0000\u0323\u0324"+ - "\u0005c\u0000\u0000\u0324\u0325\u0005k\u0000\u0000\u0325\u0326\u0005a"+ - "\u0000\u0000\u0326\u0327\u0005g\u0000\u0000\u0327\u0328\u0005e\u0000\u0000"+ - "\u0328\u00ae\u0001\u0000\u0000\u0000\u0329\u032a\u0005p\u0000\u0000\u032a"+ - "\u032b\u0005o\u0000\u0000\u032b\u032c\u0005r\u0000\u0000\u032c\u032d\u0005"+ - "t\u0000\u0000\u032d\u032e\u0005i\u0000\u0000\u032e\u032f\u0005o\u0000"+ - "\u0000\u032f\u0330\u0005n\u0000\u0000\u0330\u00b0\u0001\u0000\u0000\u0000"+ - "\u0331\u0332\u0005p\u0000\u0000\u0332\u0333\u0005r\u0000\u0000\u0333\u0334"+ - "\u0005e\u0000\u0000\u0334\u0335\u0005d\u0000\u0000\u0335\u0336\u0005i"+ - "\u0000\u0000\u0336\u0337\u0005c\u0000\u0000\u0337\u0338\u0005a\u0000\u0000"+ - "\u0338\u0339\u0005t\u0000\u0000\u0339\u033a\u0005e\u0000\u0000\u033a\u00b2"+ - "\u0001\u0000\u0000\u0000\u033b\u033c\u0005p\u0000\u0000\u033c\u033d\u0005"+ - "r\u0000\u0000\u033d\u033e\u0005i\u0000\u0000\u033e\u033f\u0005v\u0000"+ - "\u0000\u033f\u0340\u0005a\u0000\u0000\u0340\u0341\u0005t\u0000\u0000\u0341"+ - "\u0342\u0005e\u0000\u0000\u0342\u00b4\u0001\u0000\u0000\u0000\u0343\u0344"+ - "\u0005p\u0000\u0000\u0344\u0345\u0005r\u0000\u0000\u0345\u0346\u0005o"+ - "\u0000\u0000\u0346\u0347\u0005t\u0000\u0000\u0347\u0348\u0005e\u0000\u0000"+ - "\u0348\u0349\u0005c\u0000\u0000\u0349\u034a\u0005t\u0000\u0000\u034a\u034b"+ - "\u0005e\u0000\u0000\u034b\u034c\u0005d\u0000\u0000\u034c\u00b6\u0001\u0000"+ - "\u0000\u0000\u034d\u034e\u0005p\u0000\u0000\u034e\u034f\u0005u\u0000\u0000"+ - "\u034f\u0350\u0005b\u0000\u0000\u0350\u0351\u0005l\u0000\u0000\u0351\u0352"+ - "\u0005i\u0000\u0000\u0352\u0353\u0005c\u0000\u0000\u0353\u00b8\u0001\u0000"+ - "\u0000\u0000\u0354\u0355\u0005r\u0000\u0000\u0355\u0356\u0005e\u0000\u0000"+ - "\u0356\u0357\u0005a\u0000\u0000\u0357\u0358\u0005d\u0000\u0000\u0358\u0359"+ - "\u0005o\u0000\u0000\u0359\u035a\u0005n\u0000\u0000\u035a\u035b\u0005l"+ - "\u0000\u0000\u035b\u035c\u0005y\u0000\u0000\u035c\u00ba\u0001\u0000\u0000"+ - "\u0000\u035d\u035e\u0005r\u0000\u0000\u035e\u035f\u0005e\u0000\u0000\u035f"+ - "\u0360\u0005d\u0000\u0000\u0360\u0361\u0005e\u0000\u0000\u0361\u0362\u0005"+ - "f\u0000\u0000\u0362\u0363\u0005i\u0000\u0000\u0363\u0364\u0005n\u0000"+ - "\u0000\u0364\u0365\u0005e\u0000\u0000\u0365\u0366\u0005s\u0000\u0000\u0366"+ - "\u00bc\u0001\u0000\u0000\u0000\u0367\u0368\u0005r\u0000\u0000\u0368\u0369"+ - "\u0005e\u0000\u0000\u0369\u036a\u0005d\u0000\u0000\u036a\u036b\u0005e"+ - "\u0000\u0000\u036b\u036c\u0005f\u0000\u0000\u036c\u036d\u0005i\u0000\u0000"+ - "\u036d\u036e\u0005n\u0000\u0000\u036e\u036f\u0005i\u0000\u0000\u036f\u0370"+ - "\u0005t\u0000\u0000\u0370\u0371\u0005i\u0000\u0000\u0371\u0372\u0005o"+ - "\u0000\u0000\u0372\u0373\u0005n\u0000\u0000\u0373\u00be\u0001\u0000\u0000"+ - "\u0000\u0374\u0375\u0005r\u0000\u0000\u0375\u0376\u0005e\u0000\u0000\u0376"+ - "\u0377\u0005f\u0000\u0000\u0377\u0378\u0005e\u0000\u0000\u0378\u0379\u0005"+ - "r\u0000\u0000\u0379\u037a\u0005e\u0000\u0000\u037a\u037b\u0005n\u0000"+ - "\u0000\u037b\u037c\u0005c\u0000\u0000\u037c\u037d\u0005e\u0000\u0000\u037d"+ - "\u037e\u0005s\u0000\u0000\u037e\u00c0\u0001\u0000\u0000\u0000\u037f\u0380"+ - "\u0005r\u0000\u0000\u0380\u0381\u0005e\u0000\u0000\u0381\u0382\u0005p"+ - "\u0000\u0000\u0382\u00c2\u0001\u0000\u0000\u0000\u0383\u0384\u0005r\u0000"+ - "\u0000\u0384\u0385\u0005e\u0000\u0000\u0385\u0386\u0005t\u0000\u0000\u0386"+ - "\u0387\u0005u\u0000\u0000\u0387\u0388\u0005r\u0000\u0000\u0388\u0389\u0005"+ - "n\u0000\u0000\u0389\u00c4\u0001\u0000\u0000\u0000\u038a\u038b\u0005s\u0000"+ - "\u0000\u038b\u038c\u0005p\u0000\u0000\u038c\u038d\u0005e\u0000\u0000\u038d"+ - "\u038e\u0005c\u0000\u0000\u038e\u038f\u0005i\u0000\u0000\u038f\u0390\u0005"+ - "a\u0000\u0000\u0390\u0391\u0005l\u0000\u0000\u0391\u0392\u0005i\u0000"+ - "\u0000\u0392\u0393\u0005z\u0000\u0000\u0393\u0394\u0005a\u0000\u0000\u0394"+ - "\u0395\u0005t\u0000\u0000\u0395\u0396\u0005i\u0000\u0000\u0396\u0397\u0005"+ - "o\u0000\u0000\u0397\u0398\u0005n\u0000\u0000\u0398\u00c6\u0001\u0000\u0000"+ - "\u0000\u0399\u039a\u0005s\u0000\u0000\u039a\u039b\u0005p\u0000\u0000\u039b"+ - "\u039c\u0005e\u0000\u0000\u039c\u039d\u0005c\u0000\u0000\u039d\u039e\u0005"+ - "i\u0000\u0000\u039e\u039f\u0005a\u0000\u0000\u039f\u03a0\u0005l\u0000"+ - "\u0000\u03a0\u03a1\u0005i\u0000\u0000\u03a1\u03a2\u0005z\u0000\u0000\u03a2"+ - "\u03a3\u0005e\u0000\u0000\u03a3\u03a4\u0005s\u0000\u0000\u03a4\u00c8\u0001"+ - "\u0000\u0000\u0000\u03a5\u03a6\u0005s\u0000\u0000\u03a6\u03a7\u0005t\u0000"+ - "\u0000\u03a7\u03a8\u0005e\u0000\u0000\u03a8\u03a9\u0005p\u0000\u0000\u03a9"+ - "\u00ca\u0001\u0000\u0000\u0000\u03aa\u03ab\u0005s\u0000\u0000\u03ab\u03ac"+ - "\u0005t\u0000\u0000\u03ac\u03ad\u0005r\u0000\u0000\u03ad\u03ae\u0005u"+ - "\u0000\u0000\u03ae\u03af\u0005c\u0000\u0000\u03af\u03b0\u0005t\u0000\u0000"+ - "\u03b0\u00cc\u0001\u0000\u0000\u0000\u03b1\u03b2\u0005s\u0000\u0000\u03b2"+ - "\u03b3\u0005u\u0000\u0000\u03b3\u03b4\u0005b\u0000\u0000\u03b4\u03b5\u0005"+ - "c\u0000\u0000\u03b5\u03b6\u0005l\u0000\u0000\u03b6\u03b7\u0005a\u0000"+ - "\u0000\u03b7\u03b8\u0005s\u0000\u0000\u03b8\u03b9\u0005s\u0000\u0000\u03b9"+ - "\u03ba\u0005i\u0000\u0000\u03ba\u03bb\u0005f\u0000\u0000\u03bb\u03bc\u0005"+ - "i\u0000\u0000\u03bc\u03bd\u0005e\u0000\u0000\u03bd\u03be\u0005r\u0000"+ - "\u0000\u03be\u00ce\u0001\u0000\u0000\u0000\u03bf\u03c0\u0005s\u0000\u0000"+ - "\u03c0\u03c1\u0005u\u0000\u0000\u03c1\u03c2\u0005b\u0000\u0000\u03c2\u03c3"+ - "\u0005s\u0000\u0000\u03c3\u03c4\u0005e\u0000\u0000\u03c4\u03c5\u0005t"+ - "\u0000\u0000\u03c5\u00d0\u0001\u0000\u0000\u0000\u03c6\u03c7\u0005s\u0000"+ - "\u0000\u03c7\u03c8\u0005u\u0000\u0000\u03c8\u03c9\u0005b\u0000\u0000\u03c9"+ - "\u03ca\u0005s\u0000\u0000\u03ca\u03cb\u0005e\u0000\u0000\u03cb\u03cc\u0005"+ - "t\u0000\u0000\u03cc\u03cd\u0005s\u0000\u0000\u03cd\u00d2\u0001\u0000\u0000"+ - "\u0000\u03ce\u03cf\u0005s\u0000\u0000\u03cf\u03d0\u0005u\u0000\u0000\u03d0"+ - "\u03d1\u0005b\u0000\u0000\u03d1\u03d2\u0005t\u0000\u0000\u03d2\u03d3\u0005"+ - "y\u0000\u0000\u03d3\u03d4\u0005p\u0000\u0000\u03d4\u03d5\u0005e\u0000"+ - "\u0000\u03d5\u00d4\u0001\u0000\u0000\u0000\u03d6\u03d7\u0005s\u0000\u0000"+ - "\u03d7\u03d8\u0005u\u0000\u0000\u03d8\u03d9\u0005c\u0000\u0000\u03d9\u03da"+ - "\u0005c\u0000\u0000\u03da\u03db\u0005e\u0000\u0000\u03db\u03dc\u0005s"+ - "\u0000\u0000\u03dc\u03dd\u0005s\u0000\u0000\u03dd\u03de\u0005i\u0000\u0000"+ - "\u03de\u03df\u0005o\u0000\u0000\u03df\u03e0\u0005n\u0000\u0000\u03e0\u00d6"+ - "\u0001\u0000\u0000\u0000\u03e1\u03e2\u0005t\u0000\u0000\u03e2\u03e3\u0005"+ - "h\u0000\u0000\u03e3\u03e4\u0005e\u0000\u0000\u03e4\u03e5\u0005n\u0000"+ - "\u0000\u03e5\u00d8\u0001\u0000\u0000\u0000\u03e6\u03e7\u0005t\u0000\u0000"+ - "\u03e7\u03e8\u0005o\u0000\u0000\u03e8\u00da\u0001\u0000\u0000\u0000\u03e9"+ - "\u03ea\u0005t\u0000\u0000\u03ea\u03eb\u0005r\u0000\u0000\u03eb\u03ec\u0005"+ - "u\u0000\u0000\u03ec\u03ed\u0005e\u0000\u0000\u03ed\u00dc\u0001\u0000\u0000"+ - "\u0000\u03ee\u03ef\u0005t\u0000\u0000\u03ef\u03f0\u0005y\u0000\u0000\u03f0"+ - "\u03f1\u0005p\u0000\u0000\u03f1\u03f2\u0005e\u0000\u0000\u03f2\u00de\u0001"+ - "\u0000\u0000\u0000\u03f3\u03f4\u0005t\u0000\u0000\u03f4\u03f5\u0005y\u0000"+ - "\u0000\u03f5\u03f6\u0005p\u0000\u0000\u03f6\u03f7\u0005e\u0000\u0000\u03f7"+ - "\u03f8\u0005d\u0000\u0000\u03f8\u00e0\u0001\u0000\u0000\u0000\u03f9\u03fa"+ - "\u0005t\u0000\u0000\u03fa\u03fb\u0005y\u0000\u0000\u03fb\u03fc\u0005p"+ - "\u0000\u0000\u03fc\u03fd\u0005i\u0000\u0000\u03fd\u03fe\u0005n\u0000\u0000"+ - "\u03fe\u03ff\u0005g\u0000\u0000\u03ff\u00e2\u0001\u0000\u0000\u0000\u0400"+ - "\u0401\u0005u\u0000\u0000\u0401\u0402\u0005n\u0000\u0000\u0402\u0403\u0005"+ - "i\u0000\u0000\u0403\u0404\u0005o\u0000\u0000\u0404\u0405\u0005n\u0000"+ - "\u0000\u0405\u0406\u0005s\u0000\u0000\u0406\u00e4\u0001\u0000\u0000\u0000"+ - "\u0407\u0408\u0005x\u0000\u0000\u0408\u0409\u0005o\u0000\u0000\u0409\u040a"+ - "\u0005r\u0000\u0000\u040a\u00e6\u0001\u0000\u0000\u0000\u040b\u040c\t"+ - "\u0000\u0000\u0000\u040c\u00e8\u0001\u0000\u0000\u0000\b\u0000\u0112\u0118"+ - "\u011d\u0122\u0128\u012e\u0130\u0001\u0006\u0000\u0000"; + "g\u0001g\u0001g\u0001g\u0001h\u0001h\u0001h\u0001i\u0001i\u0001i\u0001"+ + "i\u0001i\u0001i\u0001i\u0001i\u0001i\u0001i\u0001i\u0001j\u0001j\u0001"+ + "j\u0001j\u0001k\u0001k\u0001k\u0001k\u0001k\u0001k\u0001k\u0001l\u0001"+ + "l\u0001l\u0001l\u0001l\u0001l\u0001l\u0001l\u0001l\u0001l\u0001l\u0001"+ + "l\u0001l\u0001l\u0001l\u0001m\u0001m\u0001m\u0001m\u0001m\u0001m\u0001"+ + "m\u0001m\u0001m\u0001m\u0001m\u0001m\u0001n\u0001n\u0001n\u0001n\u0001"+ + "n\u0001o\u0001o\u0001o\u0001o\u0001o\u0001o\u0001o\u0001p\u0001p\u0001"+ + "p\u0001p\u0001p\u0001p\u0001p\u0001p\u0001p\u0001p\u0001p\u0001p\u0001"+ + "p\u0001p\u0001q\u0001q\u0001q\u0001q\u0001q\u0001q\u0001q\u0001r\u0001"+ + "r\u0001r\u0001r\u0001r\u0001r\u0001r\u0001r\u0001s\u0001s\u0001s\u0001"+ + "s\u0001s\u0001s\u0001s\u0001s\u0001t\u0001t\u0001t\u0001t\u0001t\u0001"+ + "t\u0001t\u0001t\u0001t\u0001t\u0001t\u0001u\u0001u\u0001u\u0001u\u0001"+ + "u\u0001v\u0001v\u0001v\u0001w\u0001w\u0001w\u0001w\u0001w\u0001x\u0001"+ + "x\u0001x\u0001x\u0001x\u0001y\u0001y\u0001y\u0001y\u0001y\u0001y\u0001"+ + "z\u0001z\u0001z\u0001z\u0001z\u0001z\u0001z\u0001{\u0001{\u0001{\u0001"+ + "{\u0001{\u0001{\u0001{\u0001|\u0001|\u0001|\u0001|\u0001|\u0001|\u0001"+ + "|\u0001|\u0001|\u0001|\u0001}\u0001}\u0001}\u0001~\u0001~\u0001~\u0001"+ + "~\u0001\u007f\u0001\u007f\u0000\u0000\u0080\u0001\u0001\u0003\u0002\u0005"+ + "\u0003\u0007\u0004\t\u0005\u000b\u0006\r\u0007\u000f\b\u0011\t\u0013\n"+ + "\u0015\u000b\u0017\f\u0019\r\u001b\u000e\u001d\u000f\u001f\u0010!\u0011"+ + "#\u0012%\u0013\'\u0014)\u0015+\u0016-\u0017/\u00181\u00193\u001a5\u001b"+ + "7\u001c9\u001d;\u001e=\u001f? A!C\"E#G$I%K&M\'O(Q)S*U+W,Y-[.]/_0a1c2e"+ + "3g4i5k6m7o8q9s:u;w}?\u007f@\u0081A\u0083B\u0085C\u0087D\u0089E\u008b"+ + "F\u008dG\u008fH\u0091I\u0093J\u0095K\u0097L\u0099M\u009bN\u009dO\u009f"+ + "P\u00a1Q\u00a3R\u00a5S\u00a7T\u00a9U\u00abV\u00adW\u00afX\u00b1Y\u00b3"+ + "Z\u00b5[\u00b7\\\u00b9]\u00bb^\u00bd_\u00bf`\u00c1a\u00c3b\u00c5c\u00c7"+ + "d\u00c9e\u00cbf\u00cdg\u00cfh\u00d1i\u00d3j\u00d5k\u00d7l\u00d9m\u00db"+ + "n\u00ddo\u00dfp\u00e1q\u00e3r\u00e5s\u00e7t\u00e9u\u00ebv\u00edw\u00ef"+ + "x\u00f1y\u00f3z\u00f5{\u00f7|\u00f9}\u00fb~\u00fd\u007f\u00ff\u0080\u0001"+ + "\u0000\u0003\u0003\u0000\t\n\f\r \u0001\u000009\u0003\u0000\n\n\r\r\""+ + "\"\u0455\u0000\u0001\u0001\u0000\u0000\u0000\u0000\u0003\u0001\u0000\u0000"+ + "\u0000\u0000\u0005\u0001\u0000\u0000\u0000\u0000\u0007\u0001\u0000\u0000"+ + "\u0000\u0000\t\u0001\u0000\u0000\u0000\u0000\u000b\u0001\u0000\u0000\u0000"+ + "\u0000\r\u0001\u0000\u0000\u0000\u0000\u000f\u0001\u0000\u0000\u0000\u0000"+ + "\u0011\u0001\u0000\u0000\u0000\u0000\u0013\u0001\u0000\u0000\u0000\u0000"+ + "\u0015\u0001\u0000\u0000\u0000\u0000\u0017\u0001\u0000\u0000\u0000\u0000"+ + "\u0019\u0001\u0000\u0000\u0000\u0000\u001b\u0001\u0000\u0000\u0000\u0000"+ + "\u001d\u0001\u0000\u0000\u0000\u0000\u001f\u0001\u0000\u0000\u0000\u0000"+ + "!\u0001\u0000\u0000\u0000\u0000#\u0001\u0000\u0000\u0000\u0000%\u0001"+ + "\u0000\u0000\u0000\u0000\'\u0001\u0000\u0000\u0000\u0000)\u0001\u0000"+ + "\u0000\u0000\u0000+\u0001\u0000\u0000\u0000\u0000-\u0001\u0000\u0000\u0000"+ + "\u0000/\u0001\u0000\u0000\u0000\u00001\u0001\u0000\u0000\u0000\u00003"+ + "\u0001\u0000\u0000\u0000\u00005\u0001\u0000\u0000\u0000\u00007\u0001\u0000"+ + "\u0000\u0000\u00009\u0001\u0000\u0000\u0000\u0000;\u0001\u0000\u0000\u0000"+ + "\u0000=\u0001\u0000\u0000\u0000\u0000?\u0001\u0000\u0000\u0000\u0000A"+ + "\u0001\u0000\u0000\u0000\u0000C\u0001\u0000\u0000\u0000\u0000E\u0001\u0000"+ + "\u0000\u0000\u0000G\u0001\u0000\u0000\u0000\u0000I\u0001\u0000\u0000\u0000"+ + "\u0000K\u0001\u0000\u0000\u0000\u0000M\u0001\u0000\u0000\u0000\u0000O"+ + "\u0001\u0000\u0000\u0000\u0000Q\u0001\u0000\u0000\u0000\u0000S\u0001\u0000"+ + "\u0000\u0000\u0000U\u0001\u0000\u0000\u0000\u0000W\u0001\u0000\u0000\u0000"+ + "\u0000Y\u0001\u0000\u0000\u0000\u0000[\u0001\u0000\u0000\u0000\u0000]"+ + "\u0001\u0000\u0000\u0000\u0000_\u0001\u0000\u0000\u0000\u0000a\u0001\u0000"+ + "\u0000\u0000\u0000c\u0001\u0000\u0000\u0000\u0000e\u0001\u0000\u0000\u0000"+ + "\u0000g\u0001\u0000\u0000\u0000\u0000i\u0001\u0000\u0000\u0000\u0000k"+ + "\u0001\u0000\u0000\u0000\u0000m\u0001\u0000\u0000\u0000\u0000o\u0001\u0000"+ + "\u0000\u0000\u0000q\u0001\u0000\u0000\u0000\u0000s\u0001\u0000\u0000\u0000"+ + "\u0000u\u0001\u0000\u0000\u0000\u0000w\u0001\u0000\u0000\u0000\u0000y"+ + "\u0001\u0000\u0000\u0000\u0000{\u0001\u0000\u0000\u0000\u0000}\u0001\u0000"+ + "\u0000\u0000\u0000\u007f\u0001\u0000\u0000\u0000\u0000\u0081\u0001\u0000"+ + "\u0000\u0000\u0000\u0083\u0001\u0000\u0000\u0000\u0000\u0085\u0001\u0000"+ + "\u0000\u0000\u0000\u0087\u0001\u0000\u0000\u0000\u0000\u0089\u0001\u0000"+ + "\u0000\u0000\u0000\u008b\u0001\u0000\u0000\u0000\u0000\u008d\u0001\u0000"+ + "\u0000\u0000\u0000\u008f\u0001\u0000\u0000\u0000\u0000\u0091\u0001\u0000"+ + "\u0000\u0000\u0000\u0093\u0001\u0000\u0000\u0000\u0000\u0095\u0001\u0000"+ + "\u0000\u0000\u0000\u0097\u0001\u0000\u0000\u0000\u0000\u0099\u0001\u0000"+ + "\u0000\u0000\u0000\u009b\u0001\u0000\u0000\u0000\u0000\u009d\u0001\u0000"+ + "\u0000\u0000\u0000\u009f\u0001\u0000\u0000\u0000\u0000\u00a1\u0001\u0000"+ + "\u0000\u0000\u0000\u00a3\u0001\u0000\u0000\u0000\u0000\u00a5\u0001\u0000"+ + "\u0000\u0000\u0000\u00a7\u0001\u0000\u0000\u0000\u0000\u00a9\u0001\u0000"+ + "\u0000\u0000\u0000\u00ab\u0001\u0000\u0000\u0000\u0000\u00ad\u0001\u0000"+ + "\u0000\u0000\u0000\u00af\u0001\u0000\u0000\u0000\u0000\u00b1\u0001\u0000"+ + "\u0000\u0000\u0000\u00b3\u0001\u0000\u0000\u0000\u0000\u00b5\u0001\u0000"+ + "\u0000\u0000\u0000\u00b7\u0001\u0000\u0000\u0000\u0000\u00b9\u0001\u0000"+ + "\u0000\u0000\u0000\u00bb\u0001\u0000\u0000\u0000\u0000\u00bd\u0001\u0000"+ + "\u0000\u0000\u0000\u00bf\u0001\u0000\u0000\u0000\u0000\u00c1\u0001\u0000"+ + "\u0000\u0000\u0000\u00c3\u0001\u0000\u0000\u0000\u0000\u00c5\u0001\u0000"+ + "\u0000\u0000\u0000\u00c7\u0001\u0000\u0000\u0000\u0000\u00c9\u0001\u0000"+ + "\u0000\u0000\u0000\u00cb\u0001\u0000\u0000\u0000\u0000\u00cd\u0001\u0000"+ + "\u0000\u0000\u0000\u00cf\u0001\u0000\u0000\u0000\u0000\u00d1\u0001\u0000"+ + "\u0000\u0000\u0000\u00d3\u0001\u0000\u0000\u0000\u0000\u00d5\u0001\u0000"+ + "\u0000\u0000\u0000\u00d7\u0001\u0000\u0000\u0000\u0000\u00d9\u0001\u0000"+ + "\u0000\u0000\u0000\u00db\u0001\u0000\u0000\u0000\u0000\u00dd\u0001\u0000"+ + "\u0000\u0000\u0000\u00df\u0001\u0000\u0000\u0000\u0000\u00e1\u0001\u0000"+ + "\u0000\u0000\u0000\u00e3\u0001\u0000\u0000\u0000\u0000\u00e5\u0001\u0000"+ + "\u0000\u0000\u0000\u00e7\u0001\u0000\u0000\u0000\u0000\u00e9\u0001\u0000"+ + "\u0000\u0000\u0000\u00eb\u0001\u0000\u0000\u0000\u0000\u00ed\u0001\u0000"+ + "\u0000\u0000\u0000\u00ef\u0001\u0000\u0000\u0000\u0000\u00f1\u0001\u0000"+ + "\u0000\u0000\u0000\u00f3\u0001\u0000\u0000\u0000\u0000\u00f5\u0001\u0000"+ + "\u0000\u0000\u0000\u00f7\u0001\u0000\u0000\u0000\u0000\u00f9\u0001\u0000"+ + "\u0000\u0000\u0000\u00fb\u0001\u0000\u0000\u0000\u0000\u00fd\u0001\u0000"+ + "\u0000\u0000\u0000\u00ff\u0001\u0000\u0000\u0000\u0001\u0101\u0001\u0000"+ + "\u0000\u0000\u0003\u0103\u0001\u0000\u0000\u0000\u0005\u0106\u0001\u0000"+ + "\u0000\u0000\u0007\u0108\u0001\u0000\u0000\u0000\t\u010a\u0001\u0000\u0000"+ + "\u0000\u000b\u010d\u0001\u0000\u0000\u0000\r\u0111\u0001\u0000\u0000\u0000"+ + "\u000f\u0113\u0001\u0000\u0000\u0000\u0011\u0115\u0001\u0000\u0000\u0000"+ + "\u0013\u0117\u0001\u0000\u0000\u0000\u0015\u0119\u0001\u0000\u0000\u0000"+ + "\u0017\u011b\u0001\u0000\u0000\u0000\u0019\u011e\u0001\u0000\u0000\u0000"+ + "\u001b\u0123\u0001\u0000\u0000\u0000\u001d\u012b\u0001\u0000\u0000\u0000"+ + "\u001f\u012e\u0001\u0000\u0000\u0000!\u0133\u0001\u0000\u0000\u0000#\u013d"+ + "\u0001\u0000\u0000\u0000%\u0148\u0001\u0000\u0000\u0000\'\u014e\u0001"+ + "\u0000\u0000\u0000)\u0157\u0001\u0000\u0000\u0000+\u015a\u0001\u0000\u0000"+ + "\u0000-\u0160\u0001\u0000\u0000\u0000/\u0164\u0001\u0000\u0000\u00001"+ + "\u0168\u0001\u0000\u0000\u00003\u016b\u0001\u0000\u0000\u00005\u0172\u0001"+ + "\u0000\u0000\u00007\u0178\u0001\u0000\u0000\u00009\u0181\u0001\u0000\u0000"+ + "\u0000;\u0189\u0001\u0000\u0000\u0000=\u018e\u0001\u0000\u0000\u0000?"+ + "\u0191\u0001\u0000\u0000\u0000A\u0198\u0001\u0000\u0000\u0000C\u019e\u0001"+ + "\u0000\u0000\u0000E\u01a9\u0001\u0000\u0000\u0000G\u01b1\u0001\u0000\u0000"+ + "\u0000I\u01bb\u0001\u0000\u0000\u0000K\u01c5\u0001\u0000\u0000\u0000M"+ + "\u01d0\u0001\u0000\u0000\u0000O\u01dc\u0001\u0000\u0000\u0000Q\u01e6\u0001"+ + "\u0000\u0000\u0000S\u01ef\u0001\u0000\u0000\u0000U\u01f7\u0001\u0000\u0000"+ + "\u0000W\u0202\u0001\u0000\u0000\u0000Y\u020a\u0001\u0000\u0000\u0000["+ + "\u020d\u0001\u0000\u0000\u0000]\u0219\u0001\u0000\u0000\u0000_\u0224\u0001"+ + "\u0000\u0000\u0000a\u022d\u0001\u0000\u0000\u0000c\u0231\u0001\u0000\u0000"+ + "\u0000e\u0236\u0001\u0000\u0000\u0000g\u023a\u0001\u0000\u0000\u0000i"+ + "\u023d\u0001\u0000\u0000\u0000k\u0242\u0001\u0000\u0000\u0000m\u0248\u0001"+ + "\u0000\u0000\u0000o\u0250\u0001\u0000\u0000\u0000q\u0259\u0001\u0000\u0000"+ + "\u0000s\u0263\u0001\u0000\u0000\u0000u\u026a\u0001\u0000\u0000\u0000w"+ + "\u0270\u0001\u0000\u0000\u0000y\u0275\u0001\u0000\u0000\u0000{\u0279\u0001"+ + "\u0000\u0000\u0000}\u027e\u0001\u0000\u0000\u0000\u007f\u0287\u0001\u0000"+ + "\u0000\u0000\u0081\u028f\u0001\u0000\u0000\u0000\u0083\u0292\u0001\u0000"+ + "\u0000\u0000\u0085\u029d\u0001\u0000\u0000\u0000\u0087\u02a5\u0001\u0000"+ + "\u0000\u0000\u0089\u02ac\u0001\u0000\u0000\u0000\u008b\u02af\u0001\u0000"+ + "\u0000\u0000\u008d\u02b2\u0001\u0000\u0000\u0000\u008f\u02b8\u0001\u0000"+ + "\u0000\u0000\u0091\u02bb\u0001\u0000\u0000\u0000\u0093\u02c7\u0001\u0000"+ + "\u0000\u0000\u0095\u02cb\u0001\u0000\u0000\u0000\u0097\u02d3\u0001\u0000"+ + "\u0000\u0000\u0099\u02dd\u0001\u0000\u0000\u0000\u009b\u02e4\u0001\u0000"+ + "\u0000\u0000\u009d\u02ed\u0001\u0000\u0000\u0000\u009f\u02f4\u0001\u0000"+ + "\u0000\u0000\u00a1\u02fe\u0001\u0000\u0000\u0000\u00a3\u0307\u0001\u0000"+ + "\u0000\u0000\u00a5\u0314\u0001\u0000\u0000\u0000\u00a7\u031e\u0001\u0000"+ + "\u0000\u0000\u00a9\u0328\u0001\u0000\u0000\u0000\u00ab\u032b\u0001\u0000"+ + "\u0000\u0000\u00ad\u032f\u0001\u0000\u0000\u0000\u00af\u0334\u0001\u0000"+ + "\u0000\u0000\u00b1\u0337\u0001\u0000\u0000\u0000\u00b3\u033a\u0001\u0000"+ + "\u0000\u0000\u00b5\u0342\u0001\u0000\u0000\u0000\u00b7\u0345\u0001\u0000"+ + "\u0000\u0000\u00b9\u0349\u0001\u0000\u0000\u0000\u00bb\u034c\u0001\u0000"+ + "\u0000\u0000\u00bd\u0354\u0001\u0000\u0000\u0000\u00bf\u035c\u0001\u0000"+ + "\u0000\u0000\u00c1\u0366\u0001\u0000\u0000\u0000\u00c3\u036e\u0001\u0000"+ + "\u0000\u0000\u00c5\u0378\u0001\u0000\u0000\u0000\u00c7\u037f\u0001\u0000"+ + "\u0000\u0000\u00c9\u0388\u0001\u0000\u0000\u0000\u00cb\u038b\u0001\u0000"+ + "\u0000\u0000\u00cd\u0395\u0001\u0000\u0000\u0000\u00cf\u03a2\u0001\u0000"+ + "\u0000\u0000\u00d1\u03a6\u0001\u0000\u0000\u0000\u00d3\u03a9\u0001\u0000"+ + "\u0000\u0000\u00d5\u03b4\u0001\u0000\u0000\u0000\u00d7\u03b8\u0001\u0000"+ + "\u0000\u0000\u00d9\u03bf\u0001\u0000\u0000\u0000\u00db\u03ce\u0001\u0000"+ + "\u0000\u0000\u00dd\u03da\u0001\u0000\u0000\u0000\u00df\u03df\u0001\u0000"+ + "\u0000\u0000\u00e1\u03e6\u0001\u0000\u0000\u0000\u00e3\u03f4\u0001\u0000"+ + "\u0000\u0000\u00e5\u03fb\u0001\u0000\u0000\u0000\u00e7\u0403\u0001\u0000"+ + "\u0000\u0000\u00e9\u040b\u0001\u0000\u0000\u0000\u00eb\u0416\u0001\u0000"+ + "\u0000\u0000\u00ed\u041b\u0001\u0000\u0000\u0000\u00ef\u041e\u0001\u0000"+ + "\u0000\u0000\u00f1\u0423\u0001\u0000\u0000\u0000\u00f3\u0428\u0001\u0000"+ + "\u0000\u0000\u00f5\u042e\u0001\u0000\u0000\u0000\u00f7\u0435\u0001\u0000"+ + "\u0000\u0000\u00f9\u043c\u0001\u0000\u0000\u0000\u00fb\u0446\u0001\u0000"+ + "\u0000\u0000\u00fd\u0449\u0001\u0000\u0000\u0000\u00ff\u044d\u0001\u0000"+ + "\u0000\u0000\u0101\u0102\u0005[\u0000\u0000\u0102\u0002\u0001\u0000\u0000"+ + "\u0000\u0103\u0104\u0005.\u0000\u0000\u0104\u0105\u0005.\u0000\u0000\u0105"+ + "\u0004\u0001\u0000\u0000\u0000\u0106\u0107\u0005]\u0000\u0000\u0107\u0006"+ + "\u0001\u0000\u0000\u0000\u0108\u0109\u0005*\u0000\u0000\u0109\b\u0001"+ + "\u0000\u0000\u0000\u010a\u010b\u0005:\u0000\u0000\u010b\u010c\u0005>\u0000"+ + "\u0000\u010c\n\u0001\u0000\u0000\u0000\u010d\u010e\u0005:\u0000\u0000"+ + "\u010e\u010f\u0005>\u0000\u0000\u010f\u0110\u0005>\u0000\u0000\u0110\f"+ + "\u0001\u0000\u0000\u0000\u0111\u0112\u0005:\u0000\u0000\u0112\u000e\u0001"+ + "\u0000\u0000\u0000\u0113\u0114\u0005=\u0000\u0000\u0114\u0010\u0001\u0000"+ + "\u0000\u0000\u0115\u0116\u0005|\u0000\u0000\u0116\u0012\u0001\u0000\u0000"+ + "\u0000\u0117\u0118\u0005/\u0000\u0000\u0118\u0014\u0001\u0000\u0000\u0000"+ + "\u0119\u011a\u0005,\u0000\u0000\u011a\u0016\u0001\u0000\u0000\u0000\u011b"+ + "\u011c\u0005:\u0000\u0000\u011c\u011d\u0005:\u0000\u0000\u011d\u0018\u0001"+ + "\u0000\u0000\u0000\u011e\u011f\u0005:\u0000\u0000\u011f\u0120\u0005:\u0000"+ + "\u0000\u0120\u0121\u0005>\u0000\u0000\u0121\u001a\u0001\u0000\u0000\u0000"+ + "\u0122\u0124\u0007\u0000\u0000\u0000\u0123\u0122\u0001\u0000\u0000\u0000"+ + "\u0124\u0125\u0001\u0000\u0000\u0000\u0125\u0123\u0001\u0000\u0000\u0000"+ + "\u0125\u0126\u0001\u0000\u0000\u0000\u0126\u0127\u0001\u0000\u0000\u0000"+ + "\u0127\u0128\u0006\r\u0000\u0000\u0128\u001c\u0001\u0000\u0000\u0000\u0129"+ + "\u012c\u0003\u00efw\u0000\u012a\u012c\u0003k5\u0000\u012b\u0129\u0001"+ + "\u0000\u0000\u0000\u012b\u012a\u0001\u0000\u0000\u0000\u012c\u001e\u0001"+ + "\u0000\u0000\u0000\u012d\u012f\u0007\u0001\u0000\u0000\u012e\u012d\u0001"+ + "\u0000\u0000\u0000\u012f\u0130\u0001\u0000\u0000\u0000\u0130\u012e\u0001"+ + "\u0000\u0000\u0000\u0130\u0131\u0001\u0000\u0000\u0000\u0131 \u0001\u0000"+ + "\u0000\u0000\u0132\u0134\u0007\u0001\u0000\u0000\u0133\u0132\u0001\u0000"+ + "\u0000\u0000\u0134\u0135\u0001\u0000\u0000\u0000\u0135\u0133\u0001\u0000"+ + "\u0000\u0000\u0135\u0136\u0001\u0000\u0000\u0000\u0136\u0137\u0001\u0000"+ + "\u0000\u0000\u0137\u0139\u0005.\u0000\u0000\u0138\u013a\u0007\u0001\u0000"+ + "\u0000\u0139\u0138\u0001\u0000\u0000\u0000\u013a\u013b\u0001\u0000\u0000"+ + "\u0000\u013b\u0139\u0001\u0000\u0000\u0000\u013b\u013c\u0001\u0000\u0000"+ + "\u0000\u013c\"\u0001\u0000\u0000\u0000\u013d\u0143\u0005\"\u0000\u0000"+ + "\u013e\u0142\b\u0002\u0000\u0000\u013f\u0140\u0005\"\u0000\u0000\u0140"+ + "\u0142\u0005\"\u0000\u0000\u0141\u013e\u0001\u0000\u0000\u0000\u0141\u013f"+ + "\u0001\u0000\u0000\u0000\u0142\u0145\u0001\u0000\u0000\u0000\u0143\u0141"+ + "\u0001\u0000\u0000\u0000\u0143\u0144\u0001\u0000\u0000\u0000\u0144\u0146"+ + "\u0001\u0000\u0000\u0000\u0145\u0143\u0001\u0000\u0000\u0000\u0146\u0147"+ + "\u0005\"\u0000\u0000\u0147$\u0001\u0000\u0000\u0000\u0148\u0149\u0005"+ + "a\u0000\u0000\u0149\u014a\u0005b\u0000\u0000\u014a\u014b\u0005o\u0000"+ + "\u0000\u014b\u014c\u0005u\u0000\u0000\u014c\u014d\u0005t\u0000\u0000\u014d"+ + "&\u0001\u0000\u0000\u0000\u014e\u014f\u0005a\u0000\u0000\u014f\u0150\u0005"+ + "b\u0000\u0000\u0150\u0151\u0005s\u0000\u0000\u0151\u0152\u0005t\u0000"+ + "\u0000\u0152\u0153\u0005r\u0000\u0000\u0153\u0154\u0005a\u0000\u0000\u0154"+ + "\u0155\u0005c\u0000\u0000\u0155\u0156\u0005t\u0000\u0000\u0156(\u0001"+ + "\u0000\u0000\u0000\u0157\u0158\u0003\'\u0013\u0000\u0158\u0159\u0003\u001b"+ + "\r\u0000\u0159*\u0001\u0000\u0000\u0000\u015a\u015b\u0005a\u0000\u0000"+ + "\u015b\u015c\u0005l\u0000\u0000\u015c\u015d\u0005i\u0000\u0000\u015d\u015e"+ + "\u0005a\u0000\u0000\u015e\u015f\u0005s\u0000\u0000\u015f,\u0001\u0000"+ + "\u0000\u0000\u0160\u0161\u0005a\u0000\u0000\u0161\u0162\u0005l\u0000\u0000"+ + "\u0162\u0163\u0005l\u0000\u0000\u0163.\u0001\u0000\u0000\u0000\u0164\u0165"+ + "\u0005a\u0000\u0000\u0165\u0166\u0005n\u0000\u0000\u0166\u0167\u0005d"+ + "\u0000\u0000\u01670\u0001\u0000\u0000\u0000\u0168\u0169\u0005a\u0000\u0000"+ + "\u0169\u016a\u0005s\u0000\u0000\u016a2\u0001\u0000\u0000\u0000\u016b\u016c"+ + "\u0005a\u0000\u0000\u016c\u016d\u0005s\u0000\u0000\u016d\u016e\u0005s"+ + "\u0000\u0000\u016e\u016f\u0005i\u0000\u0000\u016f\u0170\u0005g\u0000\u0000"+ + "\u0170\u0171\u0005n\u0000\u0000\u01714\u0001\u0000\u0000\u0000\u0172\u0173"+ + "\u0005a\u0000\u0000\u0173\u0174\u0005s\u0000\u0000\u0174\u0175\u0005s"+ + "\u0000\u0000\u0175\u0176\u0005o\u0000\u0000\u0176\u0177\u0005c\u0000\u0000"+ + "\u01776\u0001\u0000\u0000\u0000\u0178\u0179\u0005b\u0000\u0000\u0179\u017a"+ + "\u0005e\u0000\u0000\u017a\u017b\u0005h\u0000\u0000\u017b\u017c\u0005a"+ + "\u0000\u0000\u017c\u017d\u0005v\u0000\u0000\u017d\u017e\u0005i\u0000\u0000"+ + "\u017e\u017f\u0005o\u0000\u0000\u017f\u0180\u0005r\u0000\u0000\u01808"+ + "\u0001\u0000\u0000\u0000\u0181\u0182\u0005b\u0000\u0000\u0182\u0183\u0005"+ + "i\u0000\u0000\u0183\u0184\u0005n\u0000\u0000\u0184\u0185\u0005d\u0000"+ + "\u0000\u0185\u0186\u0005i\u0000\u0000\u0186\u0187\u0005n\u0000\u0000\u0187"+ + "\u0188\u0005g\u0000\u0000\u0188:\u0001\u0000\u0000\u0000\u0189\u018a\u0005"+ + "b\u0000\u0000\u018a\u018b\u0005o\u0000\u0000\u018b\u018c\u0005o\u0000"+ + "\u0000\u018c\u018d\u0005l\u0000\u0000\u018d<\u0001\u0000\u0000\u0000\u018e"+ + "\u018f\u0005b\u0000\u0000\u018f\u0190\u0005y\u0000\u0000\u0190>\u0001"+ + "\u0000\u0000\u0000\u0191\u0192\u0005c\u0000\u0000\u0192\u0193\u0005h\u0000"+ + "\u0000\u0193\u0194\u0005a\u0000\u0000\u0194\u0195\u0005i\u0000\u0000\u0195"+ + "\u0196\u0005n\u0000\u0000\u0196\u0197\u0005s\u0000\u0000\u0197@\u0001"+ + "\u0000\u0000\u0000\u0198\u0199\u0005c\u0000\u0000\u0199\u019a\u0005l\u0000"+ + "\u0000\u019a\u019b\u0005a\u0000\u0000\u019b\u019c\u0005s\u0000\u0000\u019c"+ + "\u019d\u0005s\u0000\u0000\u019dB\u0001\u0000\u0000\u0000\u019e\u019f\u0005"+ + "c\u0000\u0000\u019f\u01a0\u0005l\u0000\u0000\u01a0\u01a1\u0005a\u0000"+ + "\u0000\u01a1\u01a2\u0005s\u0000\u0000\u01a2\u01a3\u0005s\u0000\u0000\u01a3"+ + "\u01a4\u0005i\u0000\u0000\u01a4\u01a5\u0005f\u0000\u0000\u01a5\u01a6\u0005"+ + "i\u0000\u0000\u01a6\u01a7\u0005e\u0000\u0000\u01a7\u01a8\u0005r\u0000"+ + "\u0000\u01a8D\u0001\u0000\u0000\u0000\u01a9\u01aa\u0005c\u0000\u0000\u01aa"+ + "\u01ab\u0005o\u0000\u0000\u01ab\u01ac\u0005m\u0000\u0000\u01ac\u01ad\u0005"+ + "m\u0000\u0000\u01ad\u01ae\u0005e\u0000\u0000\u01ae\u01af\u0005n\u0000"+ + "\u0000\u01af\u01b0\u0005t\u0000\u0000\u01b0F\u0001\u0000\u0000\u0000\u01b1"+ + "\u01b2\u0005c\u0000\u0000\u01b2\u01b3\u0005o\u0000\u0000\u01b3\u01b4\u0005"+ + "m\u0000\u0000\u01b4\u01b5\u0005p\u0000\u0000\u01b5\u01b6\u0005o\u0000"+ + "\u0000\u01b6\u01b7\u0005s\u0000\u0000\u01b7\u01b8\u0005i\u0000\u0000\u01b8"+ + "\u01b9\u0005t\u0000\u0000\u01b9\u01ba\u0005e\u0000\u0000\u01baH\u0001"+ + "\u0000\u0000\u0000\u01bb\u01bc\u0005c\u0000\u0000\u01bc\u01bd\u0005o\u0000"+ + "\u0000\u01bd\u01be\u0005n\u0000\u0000\u01be\u01bf\u0005j\u0000\u0000\u01bf"+ + "\u01c0\u0005u\u0000\u0000\u01c0\u01c1\u0005g\u0000\u0000\u01c1\u01c2\u0005"+ + "a\u0000\u0000\u01c2\u01c3\u0005t\u0000\u0000\u01c3\u01c4\u0005e\u0000"+ + "\u0000\u01c4J\u0001\u0000\u0000\u0000\u01c5\u01c6\u0005c\u0000\u0000\u01c6"+ + "\u01c7\u0005o\u0000\u0000\u01c7\u01c8\u0005n\u0000\u0000\u01c8\u01c9\u0005"+ + "j\u0000\u0000\u01c9\u01ca\u0005u\u0000\u0000\u01ca\u01cb\u0005g\u0000"+ + "\u0000\u01cb\u01cc\u0005a\u0000\u0000\u01cc\u01cd\u0005t\u0000\u0000\u01cd"+ + "\u01ce\u0005e\u0000\u0000\u01ce\u01cf\u0005s\u0000\u0000\u01cfL\u0001"+ + "\u0000\u0000\u0000\u01d0\u01d1\u0005c\u0000\u0000\u01d1\u01d2\u0005o\u0000"+ + "\u0000\u01d2\u01d3\u0005n\u0000\u0000\u01d3\u01d4\u0005j\u0000\u0000\u01d4"+ + "\u01d5\u0005u\u0000\u0000\u01d5\u01d6\u0005g\u0000\u0000\u01d6\u01d7\u0005"+ + "a\u0000\u0000\u01d7\u01d8\u0005t\u0000\u0000\u01d8\u01d9\u0005i\u0000"+ + "\u0000\u01d9\u01da\u0005o\u0000\u0000\u01da\u01db\u0005n\u0000\u0000\u01db"+ + "N\u0001\u0000\u0000\u0000\u01dc\u01dd\u0005c\u0000\u0000\u01dd\u01de\u0005"+ + "o\u0000\u0000\u01de\u01df\u0005n\u0000\u0000\u01df\u01e0\u0005n\u0000"+ + "\u0000\u01e0\u01e1\u0005e\u0000\u0000\u01e1\u01e2\u0005c\u0000\u0000\u01e2"+ + "\u01e3\u0005t\u0000\u0000\u01e3\u01e4\u0005o\u0000\u0000\u01e4\u01e5\u0005"+ + "r\u0000\u0000\u01e5P\u0001\u0000\u0000\u0000\u01e6\u01e7\u0005d\u0000"+ + "\u0000\u01e7\u01e8\u0005a\u0000\u0000\u01e8\u01e9\u0005t\u0000\u0000\u01e9"+ + "\u01ea\u0005a\u0000\u0000\u01ea\u01eb\u0005t\u0000\u0000\u01eb\u01ec\u0005"+ + "y\u0000\u0000\u01ec\u01ed\u0005p\u0000\u0000\u01ed\u01ee\u0005e\u0000"+ + "\u0000\u01eeR\u0001\u0000\u0000\u0000\u01ef\u01f0\u0005d\u0000\u0000\u01f0"+ + "\u01f1\u0005e\u0000\u0000\u01f1\u01f2\u0005f\u0000\u0000\u01f2\u01f3\u0005"+ + "a\u0000\u0000\u01f3\u01f4\u0005u\u0000\u0000\u01f4\u01f5\u0005l\u0000"+ + "\u0000\u01f5\u01f6\u0005t\u0000\u0000\u01f6T\u0001\u0000\u0000\u0000\u01f7"+ + "\u01f8\u0005d\u0000\u0000\u01f8\u01f9\u0005e\u0000\u0000\u01f9\u01fa\u0005"+ + "p\u0000\u0000\u01fa\u01fb\u0005e\u0000\u0000\u01fb\u01fc\u0005n\u0000"+ + "\u0000\u01fc\u01fd\u0005d\u0000\u0000\u01fd\u01fe\u0005e\u0000\u0000\u01fe"+ + "\u01ff\u0005n\u0000\u0000\u01ff\u0200\u0005c\u0000\u0000\u0200\u0201\u0005"+ + "y\u0000\u0000\u0201V\u0001\u0000\u0000\u0000\u0202\u0203\u0005d\u0000"+ + "\u0000\u0203\u0204\u0005e\u0000\u0000\u0204\u0205\u0005r\u0000\u0000\u0205"+ + "\u0206\u0005i\u0000\u0000\u0206\u0207\u0005v\u0000\u0000\u0207\u0208\u0005"+ + "e\u0000\u0000\u0208\u0209\u0005d\u0000\u0000\u0209X\u0001\u0000\u0000"+ + "\u0000\u020a\u020b\u0003W+\u0000\u020b\u020c\u0003\u001b\r\u0000\u020c"+ + "Z\u0001\u0000\u0000\u0000\u020d\u020e\u0005d\u0000\u0000\u020e\u020f\u0005"+ + "i\u0000\u0000\u020f\u0210\u0005f\u0000\u0000\u0210\u0211\u0005f\u0000"+ + "\u0000\u0211\u0212\u0005e\u0000\u0000\u0212\u0213\u0005r\u0000\u0000\u0213"+ + "\u0214\u0005e\u0000\u0000\u0214\u0215\u0005n\u0000\u0000\u0215\u0216\u0005"+ + "c\u0000\u0000\u0216\u0217\u0005e\u0000\u0000\u0217\u0218\u0005s\u0000"+ + "\u0000\u0218\\\u0001\u0000\u0000\u0000\u0219\u021a\u0005d\u0000\u0000"+ + "\u021a\u021b\u0005i\u0000\u0000\u021b\u021c\u0005s\u0000\u0000\u021c\u021d"+ + "\u0005j\u0000\u0000\u021d\u021e\u0005o\u0000\u0000\u021e\u021f\u0005i"+ + "\u0000\u0000\u021f\u0220\u0005n\u0000\u0000\u0220\u0221\u0005i\u0000\u0000"+ + "\u0221\u0222\u0005n\u0000\u0000\u0222\u0223\u0005g\u0000\u0000\u0223^"+ + "\u0001\u0000\u0000\u0000\u0224\u0225\u0005d\u0000\u0000\u0225\u0226\u0005"+ + "i\u0000\u0000\u0226\u0227\u0005s\u0000\u0000\u0227\u0228\u0005j\u0000"+ + "\u0000\u0228\u0229\u0005o\u0000\u0000\u0229\u022a\u0005i\u0000\u0000\u022a"+ + "\u022b\u0005n\u0000\u0000\u022b\u022c\u0005t\u0000\u0000\u022c`\u0001"+ + "\u0000\u0000\u0000\u022d\u022e\u0005d\u0000\u0000\u022e\u022f\u0005o\u0000"+ + "\u0000\u022f\u0230\u0005c\u0000\u0000\u0230b\u0001\u0000\u0000\u0000\u0231"+ + "\u0232\u0005e\u0000\u0000\u0232\u0233\u0005l\u0000\u0000\u0233\u0234\u0005"+ + "s\u0000\u0000\u0234\u0235\u0005e\u0000\u0000\u0235d\u0001\u0000\u0000"+ + "\u0000\u0236\u0237\u0005e\u0000\u0000\u0237\u0238\u0005n\u0000\u0000\u0238"+ + "\u0239\u0005d\u0000\u0000\u0239f\u0001\u0000\u0000\u0000\u023a\u023b\u0003"+ + "e2\u0000\u023b\u023c\u0003\u001b\r\u0000\u023ch\u0001\u0000\u0000\u0000"+ + "\u023d\u023e\u0005e\u0000\u0000\u023e\u023f\u0005x\u0000\u0000\u023f\u0240"+ + "\u0005p\u0000\u0000\u0240\u0241\u0005r\u0000\u0000\u0241j\u0001\u0000"+ + "\u0000\u0000\u0242\u0243\u0005f\u0000\u0000\u0243\u0244\u0005a\u0000\u0000"+ + "\u0244\u0245\u0005l\u0000\u0000\u0245\u0246\u0005s\u0000\u0000\u0246\u0247"+ + "\u0005e\u0000\u0000\u0247l\u0001\u0000\u0000\u0000\u0248\u0249\u0005f"+ + "\u0000\u0000\u0249\u024a\u0005e\u0000\u0000\u024a\u024b\u0005a\u0000\u0000"+ + "\u024b\u024c\u0005t\u0000\u0000\u024c\u024d\u0005u\u0000\u0000\u024d\u024e"+ + "\u0005r\u0000\u0000\u024e\u024f\u0005e\u0000\u0000\u024fn\u0001\u0000"+ + "\u0000\u0000\u0250\u0251\u0005f\u0000\u0000\u0251\u0252\u0005e\u0000\u0000"+ + "\u0252\u0253\u0005a\u0000\u0000\u0253\u0254\u0005t\u0000\u0000\u0254\u0255"+ + "\u0005u\u0000\u0000\u0255\u0256\u0005r\u0000\u0000\u0256\u0257\u0005e"+ + "\u0000\u0000\u0257\u0258\u0005d\u0000\u0000\u0258p\u0001\u0000\u0000\u0000"+ + "\u0259\u025a\u0005f\u0000\u0000\u025a\u025b\u0005e\u0000\u0000\u025b\u025c"+ + "\u0005a\u0000\u0000\u025c\u025d\u0005t\u0000\u0000\u025d\u025e\u0005u"+ + "\u0000\u0000\u025e\u025f\u0005r\u0000\u0000\u025f\u0260\u0005i\u0000\u0000"+ + "\u0260\u0261\u0005n\u0000\u0000\u0261\u0262\u0005g\u0000\u0000\u0262r"+ + "\u0001\u0000\u0000\u0000\u0263\u0264\u0005f\u0000\u0000\u0264\u0265\u0005"+ + "i\u0000\u0000\u0265\u0266\u0005l\u0000\u0000\u0266\u0267\u0005t\u0000"+ + "\u0000\u0267\u0268\u0005e\u0000\u0000\u0268\u0269\u0005r\u0000\u0000\u0269"+ + "t\u0001\u0000\u0000\u0000\u026a\u026b\u0005f\u0000\u0000\u026b\u026c\u0005"+ + "i\u0000\u0000\u026c\u026d\u0005r\u0000\u0000\u026d\u026e\u0005s\u0000"+ + "\u0000\u026e\u026f\u0005t\u0000\u0000\u026fv\u0001\u0000\u0000\u0000\u0270"+ + "\u0271\u0005f\u0000\u0000\u0271\u0272\u0005l\u0000\u0000\u0272\u0273\u0005"+ + "o\u0000\u0000\u0273\u0274\u0005w\u0000\u0000\u0274x\u0001\u0000\u0000"+ + "\u0000\u0275\u0276\u0005f\u0000\u0000\u0276\u0277\u0005o\u0000\u0000\u0277"+ + "\u0278\u0005r\u0000\u0000\u0278z\u0001\u0000\u0000\u0000\u0279\u027a\u0005"+ + "f\u0000\u0000\u027a\u027b\u0005r\u0000\u0000\u027b\u027c\u0005o\u0000"+ + "\u0000\u027c\u027d\u0005m\u0000\u0000\u027d|\u0001\u0000\u0000\u0000\u027e"+ + "\u027f\u0005f\u0000\u0000\u027f\u0280\u0005u\u0000\u0000\u0280\u0281\u0005"+ + "n\u0000\u0000\u0281\u0282\u0005c\u0000\u0000\u0282\u0283\u0005t\u0000"+ + "\u0000\u0283\u0284\u0005i\u0000\u0000\u0284\u0285\u0005o\u0000\u0000\u0285"+ + "\u0286\u0005n\u0000\u0000\u0286~\u0001\u0000\u0000\u0000\u0287\u0288\u0005"+ + "h\u0000\u0000\u0288\u0289\u0005a\u0000\u0000\u0289\u028a\u0005s\u0000"+ + "\u0000\u028a\u028b\u0005t\u0000\u0000\u028b\u028c\u0005y\u0000\u0000\u028c"+ + "\u028d\u0005p\u0000\u0000\u028d\u028e\u0005e\u0000\u0000\u028e\u0080\u0001"+ + "\u0000\u0000\u0000\u028f\u0290\u0005i\u0000\u0000\u0290\u0291\u0005f\u0000"+ + "\u0000\u0291\u0082\u0001\u0000\u0000\u0000\u0292\u0293\u0005i\u0000\u0000"+ + "\u0293\u0294\u0005n\u0000\u0000\u0294\u0295\u0005t\u0000\u0000\u0295\u0296"+ + "\u0005e\u0000\u0000\u0296\u0297\u0005r\u0000\u0000\u0297\u0298\u0005s"+ + "\u0000\u0000\u0298\u0299\u0005e\u0000\u0000\u0299\u029a\u0005c\u0000\u0000"+ + "\u029a\u029b\u0005t\u0000\u0000\u029b\u029c\u0005s\u0000\u0000\u029c\u0084"+ + "\u0001\u0000\u0000\u0000\u029d\u029e\u0005i\u0000\u0000\u029e\u029f\u0005"+ + "m\u0000\u0000\u029f\u02a0\u0005p\u0000\u0000\u02a0\u02a1\u0005l\u0000"+ + "\u0000\u02a1\u02a2\u0005i\u0000\u0000\u02a2\u02a3\u0005e\u0000\u0000\u02a3"+ + "\u02a4\u0005s\u0000\u0000\u02a4\u0086\u0001\u0000\u0000\u0000\u02a5\u02a6"+ + "\u0005i\u0000\u0000\u02a6\u02a7\u0005m\u0000\u0000\u02a7\u02a8\u0005p"+ + "\u0000\u0000\u02a8\u02a9\u0005o\u0000\u0000\u02a9\u02aa\u0005r\u0000\u0000"+ + "\u02aa\u02ab\u0005t\u0000\u0000\u02ab\u0088\u0001\u0000\u0000\u0000\u02ac"+ + "\u02ad\u0005i\u0000\u0000\u02ad\u02ae\u0005n\u0000\u0000\u02ae\u008a\u0001"+ + "\u0000\u0000\u0000\u02af\u02b0\u0003\u0089D\u0000\u02b0\u02b1\u0003\u001b"+ + "\r\u0000\u02b1\u008c\u0001\u0000\u0000\u0000\u02b2\u02b3\u0005i\u0000"+ + "\u0000\u02b3\u02b4\u0005n\u0000\u0000\u02b4\u02b5\u0005o\u0000\u0000\u02b5"+ + "\u02b6\u0005u\u0000\u0000\u02b6\u02b7\u0005t\u0000\u0000\u02b7\u008e\u0001"+ + "\u0000\u0000\u0000\u02b8\u02b9\u0003\u008dF\u0000\u02b9\u02ba\u0003\u001b"+ + "\r\u0000\u02ba\u0090\u0001\u0000\u0000\u0000\u02bb\u02bc\u0005i\u0000"+ + "\u0000\u02bc\u02bd\u0005n\u0000\u0000\u02bd\u02be\u0005t\u0000\u0000\u02be"+ + "\u02bf\u0005e\u0000\u0000\u02bf\u02c0\u0005r\u0000\u0000\u02c0\u02c1\u0005"+ + "a\u0000\u0000\u02c1\u02c2\u0005c\u0000\u0000\u02c2\u02c3\u0005t\u0000"+ + "\u0000\u02c3\u02c4\u0005i\u0000\u0000\u02c4\u02c5\u0005o\u0000\u0000\u02c5"+ + "\u02c6\u0005n\u0000\u0000\u02c6\u0092\u0001\u0000\u0000\u0000\u02c7\u02c8"+ + "\u0005i\u0000\u0000\u02c8\u02c9\u0005n\u0000\u0000\u02c9\u02ca\u0005v"+ + "\u0000\u0000\u02ca\u0094\u0001\u0000\u0000\u0000\u02cb\u02cc\u0005i\u0000"+ + "\u0000\u02cc\u02cd\u0005n\u0000\u0000\u02cd\u02ce\u0005v\u0000\u0000\u02ce"+ + "\u02cf\u0005e\u0000\u0000\u02cf\u02d0\u0005r\u0000\u0000\u02d0\u02d1\u0005"+ + "s\u0000\u0000\u02d1\u02d2\u0005e\u0000\u0000\u02d2\u0096\u0001\u0000\u0000"+ + "\u0000\u02d3\u02d4\u0005i\u0000\u0000\u02d4\u02d5\u0005n\u0000\u0000\u02d5"+ + "\u02d6\u0005v\u0000\u0000\u02d6\u02d7\u0005e\u0000\u0000\u02d7\u02d8\u0005"+ + "r\u0000\u0000\u02d8\u02d9\u0005t\u0000\u0000\u02d9\u02da\u0005i\u0000"+ + "\u0000\u02da\u02db\u0005n\u0000\u0000\u02db\u02dc\u0005g\u0000\u0000\u02dc"+ + "\u0098\u0001\u0000\u0000\u0000\u02dd\u02de\u0005i\u0000\u0000\u02de\u02df"+ + "\u0005s\u0000\u0000\u02df\u02e0\u0005t\u0000\u0000\u02e0\u02e1\u0005y"+ + "\u0000\u0000\u02e1\u02e2\u0005p\u0000\u0000\u02e2\u02e3\u0005e\u0000\u0000"+ + "\u02e3\u009a\u0001\u0000\u0000\u0000\u02e4\u02e5\u0005l\u0000\u0000\u02e5"+ + "\u02e6\u0005a\u0000\u0000\u02e6\u02e7\u0005n\u0000\u0000\u02e7\u02e8\u0005"+ + "g\u0000\u0000\u02e8\u02e9\u0005u\u0000\u0000\u02e9\u02ea\u0005a\u0000"+ + "\u0000\u02ea\u02eb\u0005g\u0000\u0000\u02eb\u02ec\u0005e\u0000\u0000\u02ec"+ + "\u009c\u0001\u0000\u0000\u0000\u02ed\u02ee\u0005m\u0000\u0000\u02ee\u02ef"+ + "\u0005e\u0000\u0000\u02ef\u02f0\u0005m\u0000\u0000\u02f0\u02f1\u0005b"+ + "\u0000\u0000\u02f1\u02f2\u0005e\u0000\u0000\u02f2\u02f3\u0005r\u0000\u0000"+ + "\u02f3\u009e\u0001\u0000\u0000\u0000\u02f4\u02f5\u0005m\u0000\u0000\u02f5"+ + "\u02f6\u0005e\u0000\u0000\u02f6\u02f7\u0005t\u0000\u0000\u02f7\u02f8\u0005"+ + "a\u0000\u0000\u02f8\u02f9\u0005c\u0000\u0000\u02f9\u02fa\u0005l\u0000"+ + "\u0000\u02fa\u02fb\u0005a\u0000\u0000\u02fb\u02fc\u0005s\u0000\u0000\u02fc"+ + "\u02fd\u0005s\u0000\u0000\u02fd\u00a0\u0001\u0000\u0000\u0000\u02fe\u02ff"+ + "\u0005m\u0000\u0000\u02ff\u0300\u0005e\u0000\u0000\u0300\u0301\u0005t"+ + "\u0000\u0000\u0301\u0302\u0005a\u0000\u0000\u0302\u0303\u0005d\u0000\u0000"+ + "\u0303\u0304\u0005a\u0000\u0000\u0304\u0305\u0005t\u0000\u0000\u0305\u0306"+ + "\u0005a\u0000\u0000\u0306\u00a2\u0001\u0000\u0000\u0000\u0307\u0308\u0005"+ + "m\u0000\u0000\u0308\u0309\u0005u\u0000\u0000\u0309\u030a\u0005l\u0000"+ + "\u0000\u030a\u030b\u0005t\u0000\u0000\u030b\u030c\u0005i\u0000\u0000\u030c"+ + "\u030d\u0005p\u0000\u0000\u030d\u030e\u0005l\u0000\u0000\u030e\u030f\u0005"+ + "i\u0000\u0000\u030f\u0310\u0005c\u0000\u0000\u0310\u0311\u0005i\u0000"+ + "\u0000\u0311\u0312\u0005t\u0000\u0000\u0312\u0313\u0005y\u0000\u0000\u0313"+ + "\u00a4\u0001\u0000\u0000\u0000\u0314\u0315\u0005n\u0000\u0000\u0315\u0316"+ + "\u0005a\u0000\u0000\u0316\u0317\u0005m\u0000\u0000\u0317\u0318\u0005e"+ + "\u0000\u0000\u0318\u0319\u0005s\u0000\u0000\u0319\u031a\u0005p\u0000\u0000"+ + "\u031a\u031b\u0005a\u0000\u0000\u031b\u031c\u0005c\u0000\u0000\u031c\u031d"+ + "\u0005e\u0000\u0000\u031d\u00a6\u0001\u0000\u0000\u0000\u031e\u031f\u0005"+ + "n\u0000\u0000\u031f\u0320\u0005o\u0000\u0000\u0320\u0321\u0005n\u0000"+ + "\u0000\u0321\u0322\u0005u\u0000\u0000\u0322\u0323\u0005n\u0000\u0000\u0323"+ + "\u0324\u0005i\u0000\u0000\u0324\u0325\u0005q\u0000\u0000\u0325\u0326\u0005"+ + "u\u0000\u0000\u0326\u0327\u0005e\u0000\u0000\u0327\u00a8\u0001\u0000\u0000"+ + "\u0000\u0328\u0329\u0003\u001b\r\u0000\u0329\u032a\u0003\u00a7S\u0000"+ + "\u032a\u00aa\u0001\u0000\u0000\u0000\u032b\u032c\u0005n\u0000\u0000\u032c"+ + "\u032d\u0005o\u0000\u0000\u032d\u032e\u0005t\u0000\u0000\u032e\u00ac\u0001"+ + "\u0000\u0000\u0000\u032f\u0330\u0005n\u0000\u0000\u0330\u0331\u0005u\u0000"+ + "\u0000\u0331\u0332\u0005l\u0000\u0000\u0332\u0333\u0005l\u0000\u0000\u0333"+ + "\u00ae\u0001\u0000\u0000\u0000\u0334\u0335\u0005o\u0000\u0000\u0335\u0336"+ + "\u0005f\u0000\u0000\u0336\u00b0\u0001\u0000\u0000\u0000\u0337\u0338\u0005"+ + "o\u0000\u0000\u0338\u0339\u0005r\u0000\u0000\u0339\u00b2\u0001\u0000\u0000"+ + "\u0000\u033a\u033b\u0005o\u0000\u0000\u033b\u033c\u0005r\u0000\u0000\u033c"+ + "\u033d\u0005d\u0000\u0000\u033d\u033e\u0005e\u0000\u0000\u033e\u033f\u0005"+ + "r\u0000\u0000\u033f\u0340\u0005e\u0000\u0000\u0340\u0341\u0005d\u0000"+ + "\u0000\u0341\u00b4\u0001\u0000\u0000\u0000\u0342\u0343\u0003\u001b\r\u0000"+ + "\u0343\u0344\u0003\u00b3Y\u0000\u0344\u00b6\u0001\u0000\u0000\u0000\u0345"+ + "\u0346\u0005o\u0000\u0000\u0346\u0347\u0005u\u0000\u0000\u0347\u0348\u0005"+ + "t\u0000\u0000\u0348\u00b8\u0001\u0000\u0000\u0000\u0349\u034a\u0003\u00b7"+ + "[\u0000\u034a\u034b\u0003\u001b\r\u0000\u034b\u00ba\u0001\u0000\u0000"+ + "\u0000\u034c\u034d\u0005p\u0000\u0000\u034d\u034e\u0005a\u0000\u0000\u034e"+ + "\u034f\u0005c\u0000\u0000\u034f\u0350\u0005k\u0000\u0000\u0350\u0351\u0005"+ + "a\u0000\u0000\u0351\u0352\u0005g\u0000\u0000\u0352\u0353\u0005e\u0000"+ + "\u0000\u0353\u00bc\u0001\u0000\u0000\u0000\u0354\u0355\u0005p\u0000\u0000"+ + "\u0355\u0356\u0005o\u0000\u0000\u0356\u0357\u0005r\u0000\u0000\u0357\u0358"+ + "\u0005t\u0000\u0000\u0358\u0359\u0005i\u0000\u0000\u0359\u035a\u0005o"+ + "\u0000\u0000\u035a\u035b\u0005n\u0000\u0000\u035b\u00be\u0001\u0000\u0000"+ + "\u0000\u035c\u035d\u0005p\u0000\u0000\u035d\u035e\u0005r\u0000\u0000\u035e"+ + "\u035f\u0005e\u0000\u0000\u035f\u0360\u0005d\u0000\u0000\u0360\u0361\u0005"+ + "i\u0000\u0000\u0361\u0362\u0005c\u0000\u0000\u0362\u0363\u0005a\u0000"+ + "\u0000\u0363\u0364\u0005t\u0000\u0000\u0364\u0365\u0005e\u0000\u0000\u0365"+ + "\u00c0\u0001\u0000\u0000\u0000\u0366\u0367\u0005p\u0000\u0000\u0367\u0368"+ + "\u0005r\u0000\u0000\u0368\u0369\u0005i\u0000\u0000\u0369\u036a\u0005v"+ + "\u0000\u0000\u036a\u036b\u0005a\u0000\u0000\u036b\u036c\u0005t\u0000\u0000"+ + "\u036c\u036d\u0005e\u0000\u0000\u036d\u00c2\u0001\u0000\u0000\u0000\u036e"+ + "\u036f\u0005p\u0000\u0000\u036f\u0370\u0005r\u0000\u0000\u0370\u0371\u0005"+ + "o\u0000\u0000\u0371\u0372\u0005t\u0000\u0000\u0372\u0373\u0005e\u0000"+ + "\u0000\u0373\u0374\u0005c\u0000\u0000\u0374\u0375\u0005t\u0000\u0000\u0375"+ + "\u0376\u0005e\u0000\u0000\u0376\u0377\u0005d\u0000\u0000\u0377\u00c4\u0001"+ + "\u0000\u0000\u0000\u0378\u0379\u0005p\u0000\u0000\u0379\u037a\u0005u\u0000"+ + "\u0000\u037a\u037b\u0005b\u0000\u0000\u037b\u037c\u0005l\u0000\u0000\u037c"+ + "\u037d\u0005i\u0000\u0000\u037d\u037e\u0005c\u0000\u0000\u037e\u00c6\u0001"+ + "\u0000\u0000\u0000\u037f\u0380\u0005r\u0000\u0000\u0380\u0381\u0005e\u0000"+ + "\u0000\u0381\u0382\u0005a\u0000\u0000\u0382\u0383\u0005d\u0000\u0000\u0383"+ + "\u0384\u0005o\u0000\u0000\u0384\u0385\u0005n\u0000\u0000\u0385\u0386\u0005"+ + "l\u0000\u0000\u0386\u0387\u0005y\u0000\u0000\u0387\u00c8\u0001\u0000\u0000"+ + "\u0000\u0388\u0389\u0003\u00c7c\u0000\u0389\u038a\u0003\u001b\r\u0000"+ + "\u038a\u00ca\u0001\u0000\u0000\u0000\u038b\u038c\u0005r\u0000\u0000\u038c"+ + "\u038d\u0005e\u0000\u0000\u038d\u038e\u0005d\u0000\u0000\u038e\u038f\u0005"+ + "e\u0000\u0000\u038f\u0390\u0005f\u0000\u0000\u0390\u0391\u0005i\u0000"+ + "\u0000\u0391\u0392\u0005n\u0000\u0000\u0392\u0393\u0005e\u0000\u0000\u0393"+ + "\u0394\u0005s\u0000\u0000\u0394\u00cc\u0001\u0000\u0000\u0000\u0395\u0396"+ + "\u0005r\u0000\u0000\u0396\u0397\u0005e\u0000\u0000\u0397\u0398\u0005d"+ + "\u0000\u0000\u0398\u0399\u0005e\u0000\u0000\u0399\u039a\u0005f\u0000\u0000"+ + "\u039a\u039b\u0005i\u0000\u0000\u039b\u039c\u0005n\u0000\u0000\u039c\u039d"+ + "\u0005i\u0000\u0000\u039d\u039e\u0005t\u0000\u0000\u039e\u039f\u0005i"+ + "\u0000\u0000\u039f\u03a0\u0005o\u0000\u0000\u03a0\u03a1\u0005n\u0000\u0000"+ + "\u03a1\u00ce\u0001\u0000\u0000\u0000\u03a2\u03a3\u0005r\u0000\u0000\u03a3"+ + "\u03a4\u0005e\u0000\u0000\u03a4\u03a5\u0005f\u0000\u0000\u03a5\u00d0\u0001"+ + "\u0000\u0000\u0000\u03a6\u03a7\u0003\u00cfg\u0000\u03a7\u03a8\u0003\u001b"+ + "\r\u0000\u03a8\u00d2\u0001\u0000\u0000\u0000\u03a9\u03aa\u0005r\u0000"+ + "\u0000\u03aa\u03ab\u0005e\u0000\u0000\u03ab\u03ac\u0005f\u0000\u0000\u03ac"+ + "\u03ad\u0005e\u0000\u0000\u03ad\u03ae\u0005r\u0000\u0000\u03ae\u03af\u0005"+ + "e\u0000\u0000\u03af\u03b0\u0005n\u0000\u0000\u03b0\u03b1\u0005c\u0000"+ + "\u0000\u03b1\u03b2\u0005e\u0000\u0000\u03b2\u03b3\u0005s\u0000\u0000\u03b3"+ + "\u00d4\u0001\u0000\u0000\u0000\u03b4\u03b5\u0005r\u0000\u0000\u03b5\u03b6"+ + "\u0005e\u0000\u0000\u03b6\u03b7\u0005p\u0000\u0000\u03b7\u00d6\u0001\u0000"+ + "\u0000\u0000\u03b8\u03b9\u0005r\u0000\u0000\u03b9\u03ba\u0005e\u0000\u0000"+ + "\u03ba\u03bb\u0005t\u0000\u0000\u03bb\u03bc\u0005u\u0000\u0000\u03bc\u03bd"+ + "\u0005r\u0000\u0000\u03bd\u03be\u0005n\u0000\u0000\u03be\u00d8\u0001\u0000"+ + "\u0000\u0000\u03bf\u03c0\u0005s\u0000\u0000\u03c0\u03c1\u0005p\u0000\u0000"+ + "\u03c1\u03c2\u0005e\u0000\u0000\u03c2\u03c3\u0005c\u0000\u0000\u03c3\u03c4"+ + "\u0005i\u0000\u0000\u03c4\u03c5\u0005a\u0000\u0000\u03c5\u03c6\u0005l"+ + "\u0000\u0000\u03c6\u03c7\u0005i\u0000\u0000\u03c7\u03c8\u0005z\u0000\u0000"+ + "\u03c8\u03c9\u0005a\u0000\u0000\u03c9\u03ca\u0005t\u0000\u0000\u03ca\u03cb"+ + "\u0005i\u0000\u0000\u03cb\u03cc\u0005o\u0000\u0000\u03cc\u03cd\u0005n"+ + "\u0000\u0000\u03cd\u00da\u0001\u0000\u0000\u0000\u03ce\u03cf\u0005s\u0000"+ + "\u0000\u03cf\u03d0\u0005p\u0000\u0000\u03d0\u03d1\u0005e\u0000\u0000\u03d1"+ + "\u03d2\u0005c\u0000\u0000\u03d2\u03d3\u0005i\u0000\u0000\u03d3\u03d4\u0005"+ + "a\u0000\u0000\u03d4\u03d5\u0005l\u0000\u0000\u03d5\u03d6\u0005i\u0000"+ + "\u0000\u03d6\u03d7\u0005z\u0000\u0000\u03d7\u03d8\u0005e\u0000\u0000\u03d8"+ + "\u03d9\u0005s\u0000\u0000\u03d9\u00dc\u0001\u0000\u0000\u0000\u03da\u03db"+ + "\u0005s\u0000\u0000\u03db\u03dc\u0005t\u0000\u0000\u03dc\u03dd\u0005e"+ + "\u0000\u0000\u03dd\u03de\u0005p\u0000\u0000\u03de\u00de\u0001\u0000\u0000"+ + "\u0000\u03df\u03e0\u0005s\u0000\u0000\u03e0\u03e1\u0005t\u0000\u0000\u03e1"+ + "\u03e2\u0005r\u0000\u0000\u03e2\u03e3\u0005u\u0000\u0000\u03e3\u03e4\u0005"+ + "c\u0000\u0000\u03e4\u03e5\u0005t\u0000\u0000\u03e5\u00e0\u0001\u0000\u0000"+ + "\u0000\u03e6\u03e7\u0005s\u0000\u0000\u03e7\u03e8\u0005u\u0000\u0000\u03e8"+ + "\u03e9\u0005b\u0000\u0000\u03e9\u03ea\u0005c\u0000\u0000\u03ea\u03eb\u0005"+ + "l\u0000\u0000\u03eb\u03ec\u0005a\u0000\u0000\u03ec\u03ed\u0005s\u0000"+ + "\u0000\u03ed\u03ee\u0005s\u0000\u0000\u03ee\u03ef\u0005i\u0000\u0000\u03ef"+ + "\u03f0\u0005f\u0000\u0000\u03f0\u03f1\u0005i\u0000\u0000\u03f1\u03f2\u0005"+ + "e\u0000\u0000\u03f2\u03f3\u0005r\u0000\u0000\u03f3\u00e2\u0001\u0000\u0000"+ + "\u0000\u03f4\u03f5\u0005s\u0000\u0000\u03f5\u03f6\u0005u\u0000\u0000\u03f6"+ + "\u03f7\u0005b\u0000\u0000\u03f7\u03f8\u0005s\u0000\u0000\u03f8\u03f9\u0005"+ + "e\u0000\u0000\u03f9\u03fa\u0005t\u0000\u0000\u03fa\u00e4\u0001\u0000\u0000"+ + "\u0000\u03fb\u03fc\u0005s\u0000\u0000\u03fc\u03fd\u0005u\u0000\u0000\u03fd"+ + "\u03fe\u0005b\u0000\u0000\u03fe\u03ff\u0005s\u0000\u0000\u03ff\u0400\u0005"+ + "e\u0000\u0000\u0400\u0401\u0005t\u0000\u0000\u0401\u0402\u0005s\u0000"+ + "\u0000\u0402\u00e6\u0001\u0000\u0000\u0000\u0403\u0404\u0005s\u0000\u0000"+ + "\u0404\u0405\u0005u\u0000\u0000\u0405\u0406\u0005b\u0000\u0000\u0406\u0407"+ + "\u0005t\u0000\u0000\u0407\u0408\u0005y\u0000\u0000\u0408\u0409\u0005p"+ + "\u0000\u0000\u0409\u040a\u0005e\u0000\u0000\u040a\u00e8\u0001\u0000\u0000"+ + "\u0000\u040b\u040c\u0005s\u0000\u0000\u040c\u040d\u0005u\u0000\u0000\u040d"+ + "\u040e\u0005c\u0000\u0000\u040e\u040f\u0005c\u0000\u0000\u040f\u0410\u0005"+ + "e\u0000\u0000\u0410\u0411\u0005s\u0000\u0000\u0411\u0412\u0005s\u0000"+ + "\u0000\u0412\u0413\u0005i\u0000\u0000\u0413\u0414\u0005o\u0000\u0000\u0414"+ + "\u0415\u0005n\u0000\u0000\u0415\u00ea\u0001\u0000\u0000\u0000\u0416\u0417"+ + "\u0005t\u0000\u0000\u0417\u0418\u0005h\u0000\u0000\u0418\u0419\u0005e"+ + "\u0000\u0000\u0419\u041a\u0005n\u0000\u0000\u041a\u00ec\u0001\u0000\u0000"+ + "\u0000\u041b\u041c\u0005t\u0000\u0000\u041c\u041d\u0005o\u0000\u0000\u041d"+ + "\u00ee\u0001\u0000\u0000\u0000\u041e\u041f\u0005t\u0000\u0000\u041f\u0420"+ + "\u0005r\u0000\u0000\u0420\u0421\u0005u\u0000\u0000\u0421\u0422\u0005e"+ + "\u0000\u0000\u0422\u00f0\u0001\u0000\u0000\u0000\u0423\u0424\u0005t\u0000"+ + "\u0000\u0424\u0425\u0005y\u0000\u0000\u0425\u0426\u0005p\u0000\u0000\u0426"+ + "\u0427\u0005e\u0000\u0000\u0427\u00f2\u0001\u0000\u0000\u0000\u0428\u0429"+ + "\u0005t\u0000\u0000\u0429\u042a\u0005y\u0000\u0000\u042a\u042b\u0005p"+ + "\u0000\u0000\u042b\u042c\u0005e\u0000\u0000\u042c\u042d\u0005d\u0000\u0000"+ + "\u042d\u00f4\u0001\u0000\u0000\u0000\u042e\u042f\u0005t\u0000\u0000\u042f"+ + "\u0430\u0005y\u0000\u0000\u0430\u0431\u0005p\u0000\u0000\u0431\u0432\u0005"+ + "i\u0000\u0000\u0432\u0433\u0005n\u0000\u0000\u0433\u0434\u0005g\u0000"+ + "\u0000\u0434\u00f6\u0001\u0000\u0000\u0000\u0435\u0436\u0005u\u0000\u0000"+ + "\u0436\u0437\u0005n\u0000\u0000\u0437\u0438\u0005i\u0000\u0000\u0438\u0439"+ + "\u0005o\u0000\u0000\u0439\u043a\u0005n\u0000\u0000\u043a\u043b\u0005s"+ + "\u0000\u0000\u043b\u00f8\u0001\u0000\u0000\u0000\u043c\u043d\u0005v\u0000"+ + "\u0000\u043d\u043e\u0005a\u0000\u0000\u043e\u043f\u0005r\u0000\u0000\u043f"+ + "\u0440\u0005i\u0000\u0000\u0440\u0441\u0005a\u0000\u0000\u0441\u0442\u0005"+ + "t\u0000\u0000\u0442\u0443\u0005i\u0000\u0000\u0443\u0444\u0005o\u0000"+ + "\u0000\u0444\u0445\u0005n\u0000\u0000\u0445\u00fa\u0001\u0000\u0000\u0000"+ + "\u0446\u0447\u0003\u00f9|\u0000\u0447\u0448\u0003\u001b\r\u0000\u0448"+ + "\u00fc\u0001\u0000\u0000\u0000\u0449\u044a\u0005x\u0000\u0000\u044a\u044b"+ + "\u0005o\u0000\u0000\u044b\u044c\u0005r\u0000\u0000\u044c\u00fe\u0001\u0000"+ + "\u0000\u0000\u044d\u044e\t\u0000\u0000\u0000\u044e\u0100\u0001\u0000\u0000"+ + "\u0000\b\u0000\u0125\u012b\u0130\u0135\u013b\u0141\u0143\u0001\u0006\u0000"+ + "\u0000"; public static final ATN _ATN = new ATNDeserializer().deserialize(_serializedATN.toCharArray()); static { diff --git a/backend/services/syson-services/src/main/generated/org/eclipse/syson/services/grammars/DirectEditLexer.tokens b/backend/services/syson-services/src/main/generated/org/eclipse/syson/services/grammars/DirectEditLexer.tokens index a463de789..bbb96845a 100644 --- a/backend/services/syson-services/src/main/generated/org/eclipse/syson/services/grammars/DirectEditLexer.tokens +++ b/backend/services/syson-services/src/main/generated/org/eclipse/syson/services/grammars/DirectEditLexer.tokens @@ -11,14 +11,14 @@ T__9=10 T__10=11 T__11=12 T__12=13 -T__13=14 -WS=15 -Boolean=16 -Integer=17 -Real=18 -DoubleQuotedString=19 -ABOUT=20 -ABSTRACT=21 +WS=14 +Boolean=15 +Integer=16 +Real=17 +DoubleQuotedString=18 +ABOUT=19 +ABSTRACT=20 +ABSTRACT_PREFIX=21 ALIAS=22 ALL=23 AND=24 @@ -42,94 +42,105 @@ DATATYPE=41 DEFAULT=42 DEPENDENCY=43 DERIVED=44 -DIFFERENCES=45 -DISJOINING=46 -DISJOINT=47 -DOC=48 -ELSE=49 -END=50 -EXPR=51 -FALSE=52 -FEATURE=53 -FEATURED=54 -FEATURING=55 -FILTER=56 -FIRST=57 -FLOW=58 -FOR=59 -FROM=60 -FUNCTION=61 -HASTYPE=62 -IF=63 -INTERSECTS=64 -IMPLIES=65 -IMPORT=66 -IN=67 -INPUT=68 -INTERACTION=69 -INV=70 -INVERSE=71 -INVERTING=72 -ISTYPE=73 -LANGUAGE=74 -MEMBER=75 -METACLASS=76 -METADATA=77 -MULTIPLICITY=78 -NAMESPACE=79 -NONUNIQUE=80 -NOT=81 -NULL=82 -OF=83 -OR=84 -ORDERED=85 -OUT=86 -PACKAGE=87 -PORTION=88 -PREDICATE=89 -PRIAVTE=90 -PROTECTED=91 -PUBLIC=92 -READONLY=93 -REDEFINES=94 -REDEFINITION=95 -RFERENCES=96 -REP=97 -RETURN=98 -SPECIALIZTION=99 -SPECIALIZES=100 -STEP=101 -STRCUT=102 -SUBCLASSIFIER=103 -SUBSET=104 -SUBSETS=105 -SUBTYPE=106 -SUCCESSION=107 -THEN=108 -TO=109 -TRUE=110 -TYPE=111 -TYPED=112 -TYPING=113 -UNIONS=114 -XOR=115 -ANY=116 -'ref '=1 -'['=2 -'..'=3 -']'=4 -'*'=5 -':>'=6 -':>>'=7 -':'=8 -'='=9 -'|'=10 -'/'=11 -','=12 -'::'=13 -'::>'=14 -'about'=20 -'abstract'=21 +DERIVED_PREFIX=45 +DIFFERENCES=46 +DISJOINING=47 +DISJOINT=48 +DOC=49 +ELSE=50 +END=51 +END_PREFIX=52 +EXPR=53 +FALSE=54 +FEATURE=55 +FEATURED=56 +FEATURING=57 +FILTER=58 +FIRST=59 +FLOW=60 +FOR=61 +FROM=62 +FUNCTION=63 +HASTYPE=64 +IF=65 +INTERSECTS=66 +IMPLIES=67 +IMPORT=68 +IN=69 +IN_PREFIX=70 +INOUT=71 +INOUT_PREFIX=72 +INTERACTION=73 +INV=74 +INVERSE=75 +INVERTING=76 +ISTYPE=77 +LANGUAGE=78 +MEMBER=79 +METACLASS=80 +METADATA=81 +MULTIPLICITY=82 +NAMESPACE=83 +NONUNIQUE=84 +NONUNIQUE_SUFFIX=85 +NOT=86 +NULL=87 +OF=88 +OR=89 +ORDERED=90 +ORDERED_SUFFIX=91 +OUT=92 +OUT_PREFIX=93 +PACKAGE=94 +PORTION=95 +PREDICATE=96 +PRIAVTE=97 +PROTECTED=98 +PUBLIC=99 +READONLY=100 +READONLY_PREFIX=101 +REDEFINES=102 +REDEFINITION=103 +REF=104 +REF_PREFIX=105 +REFERENCES=106 +REP=107 +RETURN=108 +SPECIALIZTION=109 +SPECIALIZES=110 +STEP=111 +STRCUT=112 +SUBCLASSIFIER=113 +SUBSET=114 +SUBSETS=115 +SUBTYPE=116 +SUCCESSION=117 +THEN=118 +TO=119 +TRUE=120 +TYPE=121 +TYPED=122 +TYPING=123 +UNIONS=124 +VARIATION=125 +VARIATION_PREFIX=126 +XOR=127 +ANY=128 +'['=1 +'..'=2 +']'=3 +'*'=4 +':>'=5 +':>>'=6 +':'=7 +'='=8 +'|'=9 +'/'=10 +','=11 +'::'=12 +'::>'=13 +'about'=19 +'abstract'=20 'alias'=22 'all'=23 'and'=24 @@ -153,74 +164,76 @@ ANY=116 'default'=42 'dependency'=43 'derived'=44 -'differences'=45 -'disjoining'=46 -'disjoint'=47 -'doc'=48 -'else'=49 -'end'=50 -'expr'=51 -'false'=52 -'feature'=53 -'featured'=54 -'featuring'=55 -'filter'=56 -'first'=57 -'flow'=58 -'for'=59 -'from'=60 -'function'=61 -'hastype'=62 -'if'=63 -'intersects'=64 -'implies'=65 -'import'=66 -'in'=67 -'inout'=68 -'interaction'=69 -'inv'=70 -'inverse'=71 -'inverting'=72 -'istype'=73 -'language'=74 -'member'=75 -'metaclass'=76 -'metadata'=77 -'multiplicity'=78 -'namespace'=79 -'nonunique'=80 -'not'=81 -'null'=82 -'of'=83 -'or'=84 -'ordered'=85 -'out'=86 -'package'=87 -'portion'=88 -'predicate'=89 -'private'=90 -'protected'=91 -'public'=92 -'readonly'=93 -'redefines'=94 -'redefinition'=95 -'references'=96 -'rep'=97 -'return'=98 -'specialization'=99 -'specializes'=100 -'step'=101 -'struct'=102 -'subclassifier'=103 -'subset'=104 -'subsets'=105 -'subtype'=106 -'succession'=107 -'then'=108 -'to'=109 -'true'=110 -'type'=111 -'typed'=112 -'typing'=113 -'unions'=114 -'xor'=115 +'differences'=46 +'disjoining'=47 +'disjoint'=48 +'doc'=49 +'else'=50 +'end'=51 +'expr'=53 +'false'=54 +'feature'=55 +'featured'=56 +'featuring'=57 +'filter'=58 +'first'=59 +'flow'=60 +'for'=61 +'from'=62 +'function'=63 +'hastype'=64 +'if'=65 +'intersects'=66 +'implies'=67 +'import'=68 +'in'=69 +'inout'=71 +'interaction'=73 +'inv'=74 +'inverse'=75 +'inverting'=76 +'istype'=77 +'language'=78 +'member'=79 +'metaclass'=80 +'metadata'=81 +'multiplicity'=82 +'namespace'=83 +'nonunique'=84 +'not'=86 +'null'=87 +'of'=88 +'or'=89 +'ordered'=90 +'out'=92 +'package'=94 +'portion'=95 +'predicate'=96 +'private'=97 +'protected'=98 +'public'=99 +'readonly'=100 +'redefines'=102 +'redefinition'=103 +'ref'=104 +'references'=106 +'rep'=107 +'return'=108 +'specialization'=109 +'specializes'=110 +'step'=111 +'struct'=112 +'subclassifier'=113 +'subset'=114 +'subsets'=115 +'subtype'=116 +'succession'=117 +'then'=118 +'to'=119 +'true'=120 +'type'=121 +'typed'=122 +'typing'=123 +'unions'=124 +'variation'=125 +'xor'=127 diff --git a/backend/services/syson-services/src/main/generated/org/eclipse/syson/services/grammars/DirectEditListener.java b/backend/services/syson-services/src/main/generated/org/eclipse/syson/services/grammars/DirectEditListener.java index eae94202f..8497a90a9 100644 --- a/backend/services/syson-services/src/main/generated/org/eclipse/syson/services/grammars/DirectEditListener.java +++ b/backend/services/syson-services/src/main/generated/org/eclipse/syson/services/grammars/DirectEditListener.java @@ -31,6 +31,76 @@ public interface DirectEditListener extends ParseTreeListener { * @param ctx the parse tree */ void exitExpression(DirectEditParser.ExpressionContext ctx); + /** + * Enter a parse tree produced by {@link DirectEditParser#prefixExpression}. + * @param ctx the parse tree + */ + void enterPrefixExpression(DirectEditParser.PrefixExpressionContext ctx); + /** + * Exit a parse tree produced by {@link DirectEditParser#prefixExpression}. + * @param ctx the parse tree + */ + void exitPrefixExpression(DirectEditParser.PrefixExpressionContext ctx); + /** + * Enter a parse tree produced by {@link DirectEditParser#directionPrefixExpression}. + * @param ctx the parse tree + */ + void enterDirectionPrefixExpression(DirectEditParser.DirectionPrefixExpressionContext ctx); + /** + * Exit a parse tree produced by {@link DirectEditParser#directionPrefixExpression}. + * @param ctx the parse tree + */ + void exitDirectionPrefixExpression(DirectEditParser.DirectionPrefixExpressionContext ctx); + /** + * Enter a parse tree produced by {@link DirectEditParser#abstractPrefixExpression}. + * @param ctx the parse tree + */ + void enterAbstractPrefixExpression(DirectEditParser.AbstractPrefixExpressionContext ctx); + /** + * Exit a parse tree produced by {@link DirectEditParser#abstractPrefixExpression}. + * @param ctx the parse tree + */ + void exitAbstractPrefixExpression(DirectEditParser.AbstractPrefixExpressionContext ctx); + /** + * Enter a parse tree produced by {@link DirectEditParser#variationPrefixExpression}. + * @param ctx the parse tree + */ + void enterVariationPrefixExpression(DirectEditParser.VariationPrefixExpressionContext ctx); + /** + * Exit a parse tree produced by {@link DirectEditParser#variationPrefixExpression}. + * @param ctx the parse tree + */ + void exitVariationPrefixExpression(DirectEditParser.VariationPrefixExpressionContext ctx); + /** + * Enter a parse tree produced by {@link DirectEditParser#readonlyPrefixExpression}. + * @param ctx the parse tree + */ + void enterReadonlyPrefixExpression(DirectEditParser.ReadonlyPrefixExpressionContext ctx); + /** + * Exit a parse tree produced by {@link DirectEditParser#readonlyPrefixExpression}. + * @param ctx the parse tree + */ + void exitReadonlyPrefixExpression(DirectEditParser.ReadonlyPrefixExpressionContext ctx); + /** + * Enter a parse tree produced by {@link DirectEditParser#derivedPrefixExpression}. + * @param ctx the parse tree + */ + void enterDerivedPrefixExpression(DirectEditParser.DerivedPrefixExpressionContext ctx); + /** + * Exit a parse tree produced by {@link DirectEditParser#derivedPrefixExpression}. + * @param ctx the parse tree + */ + void exitDerivedPrefixExpression(DirectEditParser.DerivedPrefixExpressionContext ctx); + /** + * Enter a parse tree produced by {@link DirectEditParser#endPrefixExpression}. + * @param ctx the parse tree + */ + void enterEndPrefixExpression(DirectEditParser.EndPrefixExpressionContext ctx); + /** + * Exit a parse tree produced by {@link DirectEditParser#endPrefixExpression}. + * @param ctx the parse tree + */ + void exitEndPrefixExpression(DirectEditParser.EndPrefixExpressionContext ctx); /** * Enter a parse tree produced by {@link DirectEditParser#referenceExpression}. * @param ctx the parse tree @@ -51,6 +121,36 @@ public interface DirectEditListener extends ParseTreeListener { * @param ctx the parse tree */ void exitMultiplicityExpression(DirectEditParser.MultiplicityExpressionContext ctx); + /** + * Enter a parse tree produced by {@link DirectEditParser#multiplicityPropExpression}. + * @param ctx the parse tree + */ + void enterMultiplicityPropExpression(DirectEditParser.MultiplicityPropExpressionContext ctx); + /** + * Exit a parse tree produced by {@link DirectEditParser#multiplicityPropExpression}. + * @param ctx the parse tree + */ + void exitMultiplicityPropExpression(DirectEditParser.MultiplicityPropExpressionContext ctx); + /** + * Enter a parse tree produced by {@link DirectEditParser#orderedMultiplicityExpression}. + * @param ctx the parse tree + */ + void enterOrderedMultiplicityExpression(DirectEditParser.OrderedMultiplicityExpressionContext ctx); + /** + * Exit a parse tree produced by {@link DirectEditParser#orderedMultiplicityExpression}. + * @param ctx the parse tree + */ + void exitOrderedMultiplicityExpression(DirectEditParser.OrderedMultiplicityExpressionContext ctx); + /** + * Enter a parse tree produced by {@link DirectEditParser#nonuniqueMultiplicityExpression}. + * @param ctx the parse tree + */ + void enterNonuniqueMultiplicityExpression(DirectEditParser.NonuniqueMultiplicityExpressionContext ctx); + /** + * Exit a parse tree produced by {@link DirectEditParser#nonuniqueMultiplicityExpression}. + * @param ctx the parse tree + */ + void exitNonuniqueMultiplicityExpression(DirectEditParser.NonuniqueMultiplicityExpressionContext ctx); /** * Enter a parse tree produced by {@link DirectEditParser#multiplicityExpressionMember}. * @param ctx the parse tree diff --git a/backend/services/syson-services/src/main/generated/org/eclipse/syson/services/grammars/DirectEditParser.java b/backend/services/syson-services/src/main/generated/org/eclipse/syson/services/grammars/DirectEditParser.java index c4a549e51..6afd41834 100644 --- a/backend/services/syson-services/src/main/generated/org/eclipse/syson/services/grammars/DirectEditParser.java +++ b/backend/services/syson-services/src/main/generated/org/eclipse/syson/services/grammars/DirectEditParser.java @@ -32,82 +32,97 @@ public class DirectEditParser extends Parser { new PredictionContextCache(); public static final int T__0=1, T__1=2, T__2=3, T__3=4, T__4=5, T__5=6, T__6=7, T__7=8, T__8=9, - T__9=10, T__10=11, T__11=12, T__12=13, T__13=14, WS=15, Boolean=16, Integer=17, - Real=18, DoubleQuotedString=19, ABOUT=20, ABSTRACT=21, ALIAS=22, ALL=23, - AND=24, AS=25, ASSIGN=26, ASSOC=27, BEAHVIOR=28, BINDING=29, BOOL=30, - BY=31, CHAINS=32, CLASS=33, CLASSIFIER=34, COMMENT=35, COMPOSITE=36, CONJUGATE=37, - CONJUGATES=38, CONJUGATION=39, CONNECTOR=40, DATATYPE=41, DEFAULT=42, - DEPENDENCY=43, DERIVED=44, DIFFERENCES=45, DISJOINING=46, DISJOINT=47, - DOC=48, ELSE=49, END=50, EXPR=51, FALSE=52, FEATURE=53, FEATURED=54, FEATURING=55, - FILTER=56, FIRST=57, FLOW=58, FOR=59, FROM=60, FUNCTION=61, HASTYPE=62, - IF=63, INTERSECTS=64, IMPLIES=65, IMPORT=66, IN=67, INPUT=68, INTERACTION=69, - INV=70, INVERSE=71, INVERTING=72, ISTYPE=73, LANGUAGE=74, MEMBER=75, METACLASS=76, - METADATA=77, MULTIPLICITY=78, NAMESPACE=79, NONUNIQUE=80, NOT=81, NULL=82, - OF=83, OR=84, ORDERED=85, OUT=86, PACKAGE=87, PORTION=88, PREDICATE=89, - PRIAVTE=90, PROTECTED=91, PUBLIC=92, READONLY=93, REDEFINES=94, REDEFINITION=95, - RFERENCES=96, REP=97, RETURN=98, SPECIALIZTION=99, SPECIALIZES=100, STEP=101, - STRCUT=102, SUBCLASSIFIER=103, SUBSET=104, SUBSETS=105, SUBTYPE=106, SUCCESSION=107, - THEN=108, TO=109, TRUE=110, TYPE=111, TYPED=112, TYPING=113, UNIONS=114, - XOR=115, ANY=116; + T__9=10, T__10=11, T__11=12, T__12=13, WS=14, Boolean=15, Integer=16, + Real=17, DoubleQuotedString=18, ABOUT=19, ABSTRACT=20, ABSTRACT_PREFIX=21, + ALIAS=22, ALL=23, AND=24, AS=25, ASSIGN=26, ASSOC=27, BEAHVIOR=28, BINDING=29, + BOOL=30, BY=31, CHAINS=32, CLASS=33, CLASSIFIER=34, COMMENT=35, COMPOSITE=36, + CONJUGATE=37, CONJUGATES=38, CONJUGATION=39, CONNECTOR=40, DATATYPE=41, + DEFAULT=42, DEPENDENCY=43, DERIVED=44, DERIVED_PREFIX=45, DIFFERENCES=46, + DISJOINING=47, DISJOINT=48, DOC=49, ELSE=50, END=51, END_PREFIX=52, EXPR=53, + FALSE=54, FEATURE=55, FEATURED=56, FEATURING=57, FILTER=58, FIRST=59, + FLOW=60, FOR=61, FROM=62, FUNCTION=63, HASTYPE=64, IF=65, INTERSECTS=66, + IMPLIES=67, IMPORT=68, IN=69, IN_PREFIX=70, INOUT=71, INOUT_PREFIX=72, + INTERACTION=73, INV=74, INVERSE=75, INVERTING=76, ISTYPE=77, LANGUAGE=78, + MEMBER=79, METACLASS=80, METADATA=81, MULTIPLICITY=82, NAMESPACE=83, NONUNIQUE=84, + NONUNIQUE_SUFFIX=85, NOT=86, NULL=87, OF=88, OR=89, ORDERED=90, ORDERED_SUFFIX=91, + OUT=92, OUT_PREFIX=93, PACKAGE=94, PORTION=95, PREDICATE=96, PRIAVTE=97, + PROTECTED=98, PUBLIC=99, READONLY=100, READONLY_PREFIX=101, REDEFINES=102, + REDEFINITION=103, REF=104, REF_PREFIX=105, REFERENCES=106, REP=107, RETURN=108, + SPECIALIZTION=109, SPECIALIZES=110, STEP=111, STRCUT=112, SUBCLASSIFIER=113, + SUBSET=114, SUBSETS=115, SUBTYPE=116, SUCCESSION=117, THEN=118, TO=119, + TRUE=120, TYPE=121, TYPED=122, TYPING=123, UNIONS=124, VARIATION=125, + VARIATION_PREFIX=126, XOR=127, ANY=128; public static final int - RULE_expression = 0, RULE_referenceExpression = 1, RULE_multiplicityExpression = 2, - RULE_multiplicityExpressionMember = 3, RULE_featureExpressions = 4, RULE_subsettingExpression = 5, - RULE_redefinitionExpression = 6, RULE_typingExpression = 7, RULE_valueExpression = 8, - RULE_measurementExpression = 9, RULE_transitionExpression = 10, RULE_triggerExpression = 11, - RULE_triggerExpressionName = 12, RULE_guardExpression = 13, RULE_effectExpression = 14, - RULE_qualifiedName = 15, RULE_name = 16; + RULE_expression = 0, RULE_prefixExpression = 1, RULE_directionPrefixExpression = 2, + RULE_abstractPrefixExpression = 3, RULE_variationPrefixExpression = 4, + RULE_readonlyPrefixExpression = 5, RULE_derivedPrefixExpression = 6, RULE_endPrefixExpression = 7, + RULE_referenceExpression = 8, RULE_multiplicityExpression = 9, RULE_multiplicityPropExpression = 10, + RULE_orderedMultiplicityExpression = 11, RULE_nonuniqueMultiplicityExpression = 12, + RULE_multiplicityExpressionMember = 13, RULE_featureExpressions = 14, + RULE_subsettingExpression = 15, RULE_redefinitionExpression = 16, RULE_typingExpression = 17, + RULE_valueExpression = 18, RULE_measurementExpression = 19, RULE_transitionExpression = 20, + RULE_triggerExpression = 21, RULE_triggerExpressionName = 22, RULE_guardExpression = 23, + RULE_effectExpression = 24, RULE_qualifiedName = 25, RULE_name = 26; private static String[] makeRuleNames() { return new String[] { - "expression", "referenceExpression", "multiplicityExpression", "multiplicityExpressionMember", - "featureExpressions", "subsettingExpression", "redefinitionExpression", - "typingExpression", "valueExpression", "measurementExpression", "transitionExpression", - "triggerExpression", "triggerExpressionName", "guardExpression", "effectExpression", - "qualifiedName", "name" + "expression", "prefixExpression", "directionPrefixExpression", "abstractPrefixExpression", + "variationPrefixExpression", "readonlyPrefixExpression", "derivedPrefixExpression", + "endPrefixExpression", "referenceExpression", "multiplicityExpression", + "multiplicityPropExpression", "orderedMultiplicityExpression", "nonuniqueMultiplicityExpression", + "multiplicityExpressionMember", "featureExpressions", "subsettingExpression", + "redefinitionExpression", "typingExpression", "valueExpression", "measurementExpression", + "transitionExpression", "triggerExpression", "triggerExpressionName", + "guardExpression", "effectExpression", "qualifiedName", "name" }; } public static final String[] ruleNames = makeRuleNames(); private static String[] makeLiteralNames() { return new String[] { - null, "'ref '", "'['", "'..'", "']'", "'*'", "':>'", "':>>'", "':'", - "'='", "'|'", "'/'", "','", "'::'", "'::>'", null, null, null, null, - null, "'about'", "'abstract'", "'alias'", "'all'", "'and'", "'as'", "'assign'", + null, "'['", "'..'", "']'", "'*'", "':>'", "':>>'", "':'", "'='", "'|'", + "'/'", "','", "'::'", "'::>'", null, null, null, null, null, "'about'", + "'abstract'", null, "'alias'", "'all'", "'and'", "'as'", "'assign'", "'assoc'", "'behavior'", "'binding'", "'bool'", "'by'", "'chains'", "'class'", "'classifier'", "'comment'", "'composite'", "'conjugate'", "'conjugates'", "'conjugation'", "'connector'", "'datatype'", "'default'", "'dependency'", - "'derived'", "'differences'", "'disjoining'", "'disjoint'", "'doc'", - "'else'", "'end'", "'expr'", "'false'", "'feature'", "'featured'", "'featuring'", - "'filter'", "'first'", "'flow'", "'for'", "'from'", "'function'", "'hastype'", - "'if'", "'intersects'", "'implies'", "'import'", "'in'", "'inout'", "'interaction'", - "'inv'", "'inverse'", "'inverting'", "'istype'", "'language'", "'member'", - "'metaclass'", "'metadata'", "'multiplicity'", "'namespace'", "'nonunique'", - "'not'", "'null'", "'of'", "'or'", "'ordered'", "'out'", "'package'", - "'portion'", "'predicate'", "'private'", "'protected'", "'public'", "'readonly'", - "'redefines'", "'redefinition'", "'references'", "'rep'", "'return'", + "'derived'", null, "'differences'", "'disjoining'", "'disjoint'", "'doc'", + "'else'", "'end'", null, "'expr'", "'false'", "'feature'", "'featured'", + "'featuring'", "'filter'", "'first'", "'flow'", "'for'", "'from'", "'function'", + "'hastype'", "'if'", "'intersects'", "'implies'", "'import'", "'in'", + null, "'inout'", null, "'interaction'", "'inv'", "'inverse'", "'inverting'", + "'istype'", "'language'", "'member'", "'metaclass'", "'metadata'", "'multiplicity'", + "'namespace'", "'nonunique'", null, "'not'", "'null'", "'of'", "'or'", + "'ordered'", null, "'out'", null, "'package'", "'portion'", "'predicate'", + "'private'", "'protected'", "'public'", "'readonly'", null, "'redefines'", + "'redefinition'", "'ref'", null, "'references'", "'rep'", "'return'", "'specialization'", "'specializes'", "'step'", "'struct'", "'subclassifier'", "'subset'", "'subsets'", "'subtype'", "'succession'", "'then'", "'to'", - "'true'", "'type'", "'typed'", "'typing'", "'unions'", "'xor'" + "'true'", "'type'", "'typed'", "'typing'", "'unions'", "'variation'", + null, "'xor'" }; } private static final String[] _LITERAL_NAMES = makeLiteralNames(); private static String[] makeSymbolicNames() { return new String[] { null, null, null, null, null, null, null, null, null, null, null, null, - null, null, null, "WS", "Boolean", "Integer", "Real", "DoubleQuotedString", - "ABOUT", "ABSTRACT", "ALIAS", "ALL", "AND", "AS", "ASSIGN", "ASSOC", - "BEAHVIOR", "BINDING", "BOOL", "BY", "CHAINS", "CLASS", "CLASSIFIER", - "COMMENT", "COMPOSITE", "CONJUGATE", "CONJUGATES", "CONJUGATION", "CONNECTOR", - "DATATYPE", "DEFAULT", "DEPENDENCY", "DERIVED", "DIFFERENCES", "DISJOINING", - "DISJOINT", "DOC", "ELSE", "END", "EXPR", "FALSE", "FEATURE", "FEATURED", - "FEATURING", "FILTER", "FIRST", "FLOW", "FOR", "FROM", "FUNCTION", "HASTYPE", - "IF", "INTERSECTS", "IMPLIES", "IMPORT", "IN", "INPUT", "INTERACTION", + null, null, "WS", "Boolean", "Integer", "Real", "DoubleQuotedString", + "ABOUT", "ABSTRACT", "ABSTRACT_PREFIX", "ALIAS", "ALL", "AND", "AS", + "ASSIGN", "ASSOC", "BEAHVIOR", "BINDING", "BOOL", "BY", "CHAINS", "CLASS", + "CLASSIFIER", "COMMENT", "COMPOSITE", "CONJUGATE", "CONJUGATES", "CONJUGATION", + "CONNECTOR", "DATATYPE", "DEFAULT", "DEPENDENCY", "DERIVED", "DERIVED_PREFIX", + "DIFFERENCES", "DISJOINING", "DISJOINT", "DOC", "ELSE", "END", "END_PREFIX", + "EXPR", "FALSE", "FEATURE", "FEATURED", "FEATURING", "FILTER", "FIRST", + "FLOW", "FOR", "FROM", "FUNCTION", "HASTYPE", "IF", "INTERSECTS", "IMPLIES", + "IMPORT", "IN", "IN_PREFIX", "INOUT", "INOUT_PREFIX", "INTERACTION", "INV", "INVERSE", "INVERTING", "ISTYPE", "LANGUAGE", "MEMBER", "METACLASS", - "METADATA", "MULTIPLICITY", "NAMESPACE", "NONUNIQUE", "NOT", "NULL", - "OF", "OR", "ORDERED", "OUT", "PACKAGE", "PORTION", "PREDICATE", "PRIAVTE", - "PROTECTED", "PUBLIC", "READONLY", "REDEFINES", "REDEFINITION", "RFERENCES", - "REP", "RETURN", "SPECIALIZTION", "SPECIALIZES", "STEP", "STRCUT", "SUBCLASSIFIER", - "SUBSET", "SUBSETS", "SUBTYPE", "SUCCESSION", "THEN", "TO", "TRUE", "TYPE", - "TYPED", "TYPING", "UNIONS", "XOR", "ANY" + "METADATA", "MULTIPLICITY", "NAMESPACE", "NONUNIQUE", "NONUNIQUE_SUFFIX", + "NOT", "NULL", "OF", "OR", "ORDERED", "ORDERED_SUFFIX", "OUT", "OUT_PREFIX", + "PACKAGE", "PORTION", "PREDICATE", "PRIAVTE", "PROTECTED", "PUBLIC", + "READONLY", "READONLY_PREFIX", "REDEFINES", "REDEFINITION", "REF", "REF_PREFIX", + "REFERENCES", "REP", "RETURN", "SPECIALIZTION", "SPECIALIZES", "STEP", + "STRCUT", "SUBCLASSIFIER", "SUBSET", "SUBSETS", "SUBTYPE", "SUCCESSION", + "THEN", "TO", "TRUE", "TYPE", "TYPED", "TYPING", "UNIONS", "VARIATION", + "VARIATION_PREFIX", "XOR", "ANY" }; } private static final String[] _SYMBOLIC_NAMES = makeSymbolicNames(); @@ -166,6 +181,9 @@ public FeatureExpressionsContext featureExpressions() { return getRuleContext(FeatureExpressionsContext.class,0); } public TerminalNode EOF() { return getToken(DirectEditParser.EOF, 0); } + public PrefixExpressionContext prefixExpression() { + return getRuleContext(PrefixExpressionContext.class,0); + } public ReferenceExpressionContext referenceExpression() { return getRuleContext(ReferenceExpressionContext.class,0); } @@ -175,6 +193,9 @@ public NameContext name() { public MultiplicityExpressionContext multiplicityExpression() { return getRuleContext(MultiplicityExpressionContext.class,0); } + public MultiplicityPropExpressionContext multiplicityPropExpression() { + return getRuleContext(MultiplicityPropExpressionContext.class,0); + } public ExpressionContext(ParserRuleContext parent, int invokingState) { super(parent, invokingState); } @@ -196,39 +217,59 @@ public final ExpressionContext expression() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(35); + setState(55); _errHandler.sync(this); - _la = _input.LA(1); - if (_la==T__0) { + switch ( getInterpreter().adaptivePredict(_input,0,_ctx) ) { + case 1: { - setState(34); + setState(54); + prefixExpression(); + } + break; + } + setState(58); + _errHandler.sync(this); + switch ( getInterpreter().adaptivePredict(_input,1,_ctx) ) { + case 1: + { + setState(57); referenceExpression(); } + break; } - - setState(38); + setState(61); _errHandler.sync(this); _la = _input.LA(1); - if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << T__2) | (1L << T__3) | (1L << T__4) | (1L << T__9) | (1L << T__10) | (1L << T__11) | (1L << T__12) | (1L << WS) | (1L << Boolean) | (1L << Integer) | (1L << Real) | (1L << DoubleQuotedString) | (1L << ABOUT) | (1L << ABSTRACT) | (1L << ALIAS) | (1L << ALL) | (1L << AND) | (1L << AS) | (1L << ASSIGN) | (1L << ASSOC) | (1L << BEAHVIOR) | (1L << BINDING) | (1L << BOOL) | (1L << BY) | (1L << CHAINS) | (1L << CLASS) | (1L << CLASSIFIER) | (1L << COMMENT) | (1L << COMPOSITE) | (1L << CONJUGATE) | (1L << CONJUGATES) | (1L << CONJUGATION) | (1L << CONNECTOR) | (1L << DATATYPE) | (1L << DEFAULT) | (1L << DEPENDENCY) | (1L << DERIVED) | (1L << DIFFERENCES) | (1L << DISJOINING) | (1L << DISJOINT) | (1L << DOC) | (1L << ELSE) | (1L << END) | (1L << EXPR) | (1L << FALSE) | (1L << FEATURE) | (1L << FEATURED) | (1L << FEATURING) | (1L << FILTER) | (1L << FIRST) | (1L << FLOW) | (1L << FOR) | (1L << FROM) | (1L << FUNCTION) | (1L << HASTYPE) | (1L << IF))) != 0) || ((((_la - 64)) & ~0x3f) == 0 && ((1L << (_la - 64)) & ((1L << (INTERSECTS - 64)) | (1L << (IMPLIES - 64)) | (1L << (IMPORT - 64)) | (1L << (IN - 64)) | (1L << (INPUT - 64)) | (1L << (INTERACTION - 64)) | (1L << (INV - 64)) | (1L << (INVERSE - 64)) | (1L << (INVERTING - 64)) | (1L << (ISTYPE - 64)) | (1L << (LANGUAGE - 64)) | (1L << (MEMBER - 64)) | (1L << (METACLASS - 64)) | (1L << (METADATA - 64)) | (1L << (MULTIPLICITY - 64)) | (1L << (NAMESPACE - 64)) | (1L << (NONUNIQUE - 64)) | (1L << (NOT - 64)) | (1L << (NULL - 64)) | (1L << (OF - 64)) | (1L << (OR - 64)) | (1L << (ORDERED - 64)) | (1L << (OUT - 64)) | (1L << (PACKAGE - 64)) | (1L << (PORTION - 64)) | (1L << (PREDICATE - 64)) | (1L << (PRIAVTE - 64)) | (1L << (PROTECTED - 64)) | (1L << (PUBLIC - 64)) | (1L << (READONLY - 64)) | (1L << (REDEFINES - 64)) | (1L << (REDEFINITION - 64)) | (1L << (RFERENCES - 64)) | (1L << (REP - 64)) | (1L << (RETURN - 64)) | (1L << (SPECIALIZTION - 64)) | (1L << (SPECIALIZES - 64)) | (1L << (STEP - 64)) | (1L << (STRCUT - 64)) | (1L << (SUBCLASSIFIER - 64)) | (1L << (SUBSET - 64)) | (1L << (SUBSETS - 64)) | (1L << (SUBTYPE - 64)) | (1L << (SUCCESSION - 64)) | (1L << (THEN - 64)) | (1L << (TO - 64)) | (1L << (TRUE - 64)) | (1L << (TYPE - 64)) | (1L << (TYPED - 64)) | (1L << (TYPING - 64)) | (1L << (UNIONS - 64)) | (1L << (XOR - 64)) | (1L << (ANY - 64)))) != 0)) { + if (((((_la - 2)) & ~0x3f) == 0 && ((1L << (_la - 2)) & ((1L << (T__1 - 2)) | (1L << (T__2 - 2)) | (1L << (T__3 - 2)) | (1L << (T__8 - 2)) | (1L << (T__9 - 2)) | (1L << (T__10 - 2)) | (1L << (T__11 - 2)) | (1L << (WS - 2)) | (1L << (Boolean - 2)) | (1L << (Integer - 2)) | (1L << (Real - 2)) | (1L << (DoubleQuotedString - 2)) | (1L << (ABOUT - 2)) | (1L << (ABSTRACT - 2)) | (1L << (ABSTRACT_PREFIX - 2)) | (1L << (ALIAS - 2)) | (1L << (ALL - 2)) | (1L << (AND - 2)) | (1L << (AS - 2)) | (1L << (ASSIGN - 2)) | (1L << (ASSOC - 2)) | (1L << (BEAHVIOR - 2)) | (1L << (BINDING - 2)) | (1L << (BOOL - 2)) | (1L << (BY - 2)) | (1L << (CHAINS - 2)) | (1L << (CLASS - 2)) | (1L << (CLASSIFIER - 2)) | (1L << (COMMENT - 2)) | (1L << (COMPOSITE - 2)) | (1L << (CONJUGATE - 2)) | (1L << (CONJUGATES - 2)) | (1L << (CONJUGATION - 2)) | (1L << (CONNECTOR - 2)) | (1L << (DATATYPE - 2)) | (1L << (DEFAULT - 2)) | (1L << (DEPENDENCY - 2)) | (1L << (DERIVED - 2)) | (1L << (DERIVED_PREFIX - 2)) | (1L << (DIFFERENCES - 2)) | (1L << (DISJOINING - 2)) | (1L << (DISJOINT - 2)) | (1L << (DOC - 2)) | (1L << (ELSE - 2)) | (1L << (END - 2)) | (1L << (END_PREFIX - 2)) | (1L << (EXPR - 2)) | (1L << (FALSE - 2)) | (1L << (FEATURE - 2)) | (1L << (FEATURED - 2)) | (1L << (FEATURING - 2)) | (1L << (FILTER - 2)) | (1L << (FIRST - 2)) | (1L << (FLOW - 2)) | (1L << (FOR - 2)) | (1L << (FROM - 2)) | (1L << (FUNCTION - 2)) | (1L << (HASTYPE - 2)) | (1L << (IF - 2)))) != 0) || ((((_la - 66)) & ~0x3f) == 0 && ((1L << (_la - 66)) & ((1L << (INTERSECTS - 66)) | (1L << (IMPLIES - 66)) | (1L << (IMPORT - 66)) | (1L << (IN - 66)) | (1L << (IN_PREFIX - 66)) | (1L << (INOUT - 66)) | (1L << (INOUT_PREFIX - 66)) | (1L << (INTERACTION - 66)) | (1L << (INV - 66)) | (1L << (INVERSE - 66)) | (1L << (INVERTING - 66)) | (1L << (ISTYPE - 66)) | (1L << (LANGUAGE - 66)) | (1L << (MEMBER - 66)) | (1L << (METACLASS - 66)) | (1L << (METADATA - 66)) | (1L << (MULTIPLICITY - 66)) | (1L << (NAMESPACE - 66)) | (1L << (NONUNIQUE - 66)) | (1L << (NOT - 66)) | (1L << (NULL - 66)) | (1L << (OF - 66)) | (1L << (OR - 66)) | (1L << (ORDERED - 66)) | (1L << (OUT - 66)) | (1L << (OUT_PREFIX - 66)) | (1L << (PACKAGE - 66)) | (1L << (PORTION - 66)) | (1L << (PREDICATE - 66)) | (1L << (PRIAVTE - 66)) | (1L << (PROTECTED - 66)) | (1L << (PUBLIC - 66)) | (1L << (READONLY - 66)) | (1L << (READONLY_PREFIX - 66)) | (1L << (REDEFINES - 66)) | (1L << (REDEFINITION - 66)) | (1L << (REF - 66)) | (1L << (REF_PREFIX - 66)) | (1L << (REFERENCES - 66)) | (1L << (REP - 66)) | (1L << (RETURN - 66)) | (1L << (SPECIALIZTION - 66)) | (1L << (SPECIALIZES - 66)) | (1L << (STEP - 66)) | (1L << (STRCUT - 66)) | (1L << (SUBCLASSIFIER - 66)) | (1L << (SUBSET - 66)) | (1L << (SUBSETS - 66)) | (1L << (SUBTYPE - 66)) | (1L << (SUCCESSION - 66)) | (1L << (THEN - 66)) | (1L << (TO - 66)) | (1L << (TRUE - 66)) | (1L << (TYPE - 66)) | (1L << (TYPED - 66)) | (1L << (TYPING - 66)) | (1L << (UNIONS - 66)) | (1L << (VARIATION - 66)) | (1L << (VARIATION_PREFIX - 66)) | (1L << (XOR - 66)) | (1L << (ANY - 66)))) != 0)) { { - setState(37); + setState(60); name(); } } - setState(41); + setState(64); _errHandler.sync(this); _la = _input.LA(1); - if (_la==T__1) { + if (_la==T__0) { { - setState(40); + setState(63); multiplicityExpression(); } } - setState(43); + setState(67); + _errHandler.sync(this); + switch ( getInterpreter().adaptivePredict(_input,4,_ctx) ) { + case 1: + { + setState(66); + multiplicityPropExpression(); + } + break; + } + setState(69); featureExpressions(); - setState(44); + setState(70); match(EOF); } } @@ -243,7 +284,353 @@ public final ExpressionContext expression() throws RecognitionException { return _localctx; } + public static class PrefixExpressionContext extends ParserRuleContext { + public DirectionPrefixExpressionContext directionPrefixExpression() { + return getRuleContext(DirectionPrefixExpressionContext.class,0); + } + public AbstractPrefixExpressionContext abstractPrefixExpression() { + return getRuleContext(AbstractPrefixExpressionContext.class,0); + } + public VariationPrefixExpressionContext variationPrefixExpression() { + return getRuleContext(VariationPrefixExpressionContext.class,0); + } + public ReadonlyPrefixExpressionContext readonlyPrefixExpression() { + return getRuleContext(ReadonlyPrefixExpressionContext.class,0); + } + public DerivedPrefixExpressionContext derivedPrefixExpression() { + return getRuleContext(DerivedPrefixExpressionContext.class,0); + } + public EndPrefixExpressionContext endPrefixExpression() { + return getRuleContext(EndPrefixExpressionContext.class,0); + } + public PrefixExpressionContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_prefixExpression; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof DirectEditListener ) ((DirectEditListener)listener).enterPrefixExpression(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof DirectEditListener ) ((DirectEditListener)listener).exitPrefixExpression(this); + } + } + + public final PrefixExpressionContext prefixExpression() throws RecognitionException { + PrefixExpressionContext _localctx = new PrefixExpressionContext(_ctx, getState()); + enterRule(_localctx, 2, RULE_prefixExpression); + try { + enterOuterAlt(_localctx, 1); + { + setState(73); + _errHandler.sync(this); + switch ( getInterpreter().adaptivePredict(_input,5,_ctx) ) { + case 1: + { + setState(72); + directionPrefixExpression(); + } + break; + } + setState(76); + _errHandler.sync(this); + switch ( getInterpreter().adaptivePredict(_input,6,_ctx) ) { + case 1: + { + setState(75); + abstractPrefixExpression(); + } + break; + } + setState(79); + _errHandler.sync(this); + switch ( getInterpreter().adaptivePredict(_input,7,_ctx) ) { + case 1: + { + setState(78); + variationPrefixExpression(); + } + break; + } + setState(82); + _errHandler.sync(this); + switch ( getInterpreter().adaptivePredict(_input,8,_ctx) ) { + case 1: + { + setState(81); + readonlyPrefixExpression(); + } + break; + } + setState(85); + _errHandler.sync(this); + switch ( getInterpreter().adaptivePredict(_input,9,_ctx) ) { + case 1: + { + setState(84); + derivedPrefixExpression(); + } + break; + } + setState(88); + _errHandler.sync(this); + switch ( getInterpreter().adaptivePredict(_input,10,_ctx) ) { + case 1: + { + setState(87); + endPrefixExpression(); + } + break; + } + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + public static class DirectionPrefixExpressionContext extends ParserRuleContext { + public TerminalNode IN_PREFIX() { return getToken(DirectEditParser.IN_PREFIX, 0); } + public TerminalNode OUT_PREFIX() { return getToken(DirectEditParser.OUT_PREFIX, 0); } + public TerminalNode INOUT_PREFIX() { return getToken(DirectEditParser.INOUT_PREFIX, 0); } + public DirectionPrefixExpressionContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_directionPrefixExpression; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof DirectEditListener ) ((DirectEditListener)listener).enterDirectionPrefixExpression(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof DirectEditListener ) ((DirectEditListener)listener).exitDirectionPrefixExpression(this); + } + } + + public final DirectionPrefixExpressionContext directionPrefixExpression() throws RecognitionException { + DirectionPrefixExpressionContext _localctx = new DirectionPrefixExpressionContext(_ctx, getState()); + enterRule(_localctx, 4, RULE_directionPrefixExpression); + int _la; + try { + enterOuterAlt(_localctx, 1); + { + setState(90); + _la = _input.LA(1); + if ( !(((((_la - 70)) & ~0x3f) == 0 && ((1L << (_la - 70)) & ((1L << (IN_PREFIX - 70)) | (1L << (INOUT_PREFIX - 70)) | (1L << (OUT_PREFIX - 70)))) != 0)) ) { + _errHandler.recoverInline(this); + } + else { + if ( _input.LA(1)==Token.EOF ) matchedEOF = true; + _errHandler.reportMatch(this); + consume(); + } + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + public static class AbstractPrefixExpressionContext extends ParserRuleContext { + public TerminalNode ABSTRACT_PREFIX() { return getToken(DirectEditParser.ABSTRACT_PREFIX, 0); } + public AbstractPrefixExpressionContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_abstractPrefixExpression; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof DirectEditListener ) ((DirectEditListener)listener).enterAbstractPrefixExpression(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof DirectEditListener ) ((DirectEditListener)listener).exitAbstractPrefixExpression(this); + } + } + + public final AbstractPrefixExpressionContext abstractPrefixExpression() throws RecognitionException { + AbstractPrefixExpressionContext _localctx = new AbstractPrefixExpressionContext(_ctx, getState()); + enterRule(_localctx, 6, RULE_abstractPrefixExpression); + try { + enterOuterAlt(_localctx, 1); + { + setState(92); + match(ABSTRACT_PREFIX); + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + public static class VariationPrefixExpressionContext extends ParserRuleContext { + public TerminalNode VARIATION_PREFIX() { return getToken(DirectEditParser.VARIATION_PREFIX, 0); } + public VariationPrefixExpressionContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_variationPrefixExpression; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof DirectEditListener ) ((DirectEditListener)listener).enterVariationPrefixExpression(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof DirectEditListener ) ((DirectEditListener)listener).exitVariationPrefixExpression(this); + } + } + + public final VariationPrefixExpressionContext variationPrefixExpression() throws RecognitionException { + VariationPrefixExpressionContext _localctx = new VariationPrefixExpressionContext(_ctx, getState()); + enterRule(_localctx, 8, RULE_variationPrefixExpression); + try { + enterOuterAlt(_localctx, 1); + { + setState(94); + match(VARIATION_PREFIX); + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + public static class ReadonlyPrefixExpressionContext extends ParserRuleContext { + public TerminalNode READONLY_PREFIX() { return getToken(DirectEditParser.READONLY_PREFIX, 0); } + public ReadonlyPrefixExpressionContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_readonlyPrefixExpression; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof DirectEditListener ) ((DirectEditListener)listener).enterReadonlyPrefixExpression(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof DirectEditListener ) ((DirectEditListener)listener).exitReadonlyPrefixExpression(this); + } + } + + public final ReadonlyPrefixExpressionContext readonlyPrefixExpression() throws RecognitionException { + ReadonlyPrefixExpressionContext _localctx = new ReadonlyPrefixExpressionContext(_ctx, getState()); + enterRule(_localctx, 10, RULE_readonlyPrefixExpression); + try { + enterOuterAlt(_localctx, 1); + { + setState(96); + match(READONLY_PREFIX); + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + public static class DerivedPrefixExpressionContext extends ParserRuleContext { + public TerminalNode DERIVED_PREFIX() { return getToken(DirectEditParser.DERIVED_PREFIX, 0); } + public DerivedPrefixExpressionContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_derivedPrefixExpression; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof DirectEditListener ) ((DirectEditListener)listener).enterDerivedPrefixExpression(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof DirectEditListener ) ((DirectEditListener)listener).exitDerivedPrefixExpression(this); + } + } + + public final DerivedPrefixExpressionContext derivedPrefixExpression() throws RecognitionException { + DerivedPrefixExpressionContext _localctx = new DerivedPrefixExpressionContext(_ctx, getState()); + enterRule(_localctx, 12, RULE_derivedPrefixExpression); + try { + enterOuterAlt(_localctx, 1); + { + setState(98); + match(DERIVED_PREFIX); + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + public static class EndPrefixExpressionContext extends ParserRuleContext { + public TerminalNode END_PREFIX() { return getToken(DirectEditParser.END_PREFIX, 0); } + public EndPrefixExpressionContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_endPrefixExpression; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof DirectEditListener ) ((DirectEditListener)listener).enterEndPrefixExpression(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof DirectEditListener ) ((DirectEditListener)listener).exitEndPrefixExpression(this); + } + } + + public final EndPrefixExpressionContext endPrefixExpression() throws RecognitionException { + EndPrefixExpressionContext _localctx = new EndPrefixExpressionContext(_ctx, getState()); + enterRule(_localctx, 14, RULE_endPrefixExpression); + try { + enterOuterAlt(_localctx, 1); + { + setState(100); + match(END_PREFIX); + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + public static class ReferenceExpressionContext extends ParserRuleContext { + public TerminalNode REF_PREFIX() { return getToken(DirectEditParser.REF_PREFIX, 0); } public ReferenceExpressionContext(ParserRuleContext parent, int invokingState) { super(parent, invokingState); } @@ -260,12 +647,12 @@ public void exitRule(ParseTreeListener listener) { public final ReferenceExpressionContext referenceExpression() throws RecognitionException { ReferenceExpressionContext _localctx = new ReferenceExpressionContext(_ctx, getState()); - enterRule(_localctx, 2, RULE_referenceExpression); + enterRule(_localctx, 16, RULE_referenceExpression); try { enterOuterAlt(_localctx, 1); { - setState(46); - match(T__0); + setState(102); + match(REF_PREFIX); } } catch (RecognitionException re) { @@ -304,28 +691,163 @@ public void exitRule(ParseTreeListener listener) { public final MultiplicityExpressionContext multiplicityExpression() throws RecognitionException { MultiplicityExpressionContext _localctx = new MultiplicityExpressionContext(_ctx, getState()); - enterRule(_localctx, 4, RULE_multiplicityExpression); + enterRule(_localctx, 18, RULE_multiplicityExpression); try { enterOuterAlt(_localctx, 1); { - setState(48); - match(T__1); - setState(52); + setState(104); + match(T__0); + setState(108); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,3,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,11,_ctx) ) { case 1: { - setState(49); + setState(105); ((MultiplicityExpressionContext)_localctx).lowerBound = multiplicityExpressionMember(); - setState(50); - match(T__2); + setState(106); + match(T__1); } break; } - setState(54); + setState(110); ((MultiplicityExpressionContext)_localctx).upperBound = multiplicityExpressionMember(); - setState(55); - match(T__3); + setState(111); + match(T__2); + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + public static class MultiplicityPropExpressionContext extends ParserRuleContext { + public OrderedMultiplicityExpressionContext orderedMultiplicityExpression() { + return getRuleContext(OrderedMultiplicityExpressionContext.class,0); + } + public NonuniqueMultiplicityExpressionContext nonuniqueMultiplicityExpression() { + return getRuleContext(NonuniqueMultiplicityExpressionContext.class,0); + } + public MultiplicityPropExpressionContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_multiplicityPropExpression; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof DirectEditListener ) ((DirectEditListener)listener).enterMultiplicityPropExpression(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof DirectEditListener ) ((DirectEditListener)listener).exitMultiplicityPropExpression(this); + } + } + + public final MultiplicityPropExpressionContext multiplicityPropExpression() throws RecognitionException { + MultiplicityPropExpressionContext _localctx = new MultiplicityPropExpressionContext(_ctx, getState()); + enterRule(_localctx, 20, RULE_multiplicityPropExpression); + int _la; + try { + enterOuterAlt(_localctx, 1); + { + setState(114); + _errHandler.sync(this); + _la = _input.LA(1); + if (_la==ORDERED_SUFFIX) { + { + setState(113); + orderedMultiplicityExpression(); + } + } + + setState(117); + _errHandler.sync(this); + _la = _input.LA(1); + if (_la==NONUNIQUE_SUFFIX) { + { + setState(116); + nonuniqueMultiplicityExpression(); + } + } + + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + public static class OrderedMultiplicityExpressionContext extends ParserRuleContext { + public TerminalNode ORDERED_SUFFIX() { return getToken(DirectEditParser.ORDERED_SUFFIX, 0); } + public OrderedMultiplicityExpressionContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_orderedMultiplicityExpression; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof DirectEditListener ) ((DirectEditListener)listener).enterOrderedMultiplicityExpression(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof DirectEditListener ) ((DirectEditListener)listener).exitOrderedMultiplicityExpression(this); + } + } + + public final OrderedMultiplicityExpressionContext orderedMultiplicityExpression() throws RecognitionException { + OrderedMultiplicityExpressionContext _localctx = new OrderedMultiplicityExpressionContext(_ctx, getState()); + enterRule(_localctx, 22, RULE_orderedMultiplicityExpression); + try { + enterOuterAlt(_localctx, 1); + { + setState(119); + match(ORDERED_SUFFIX); + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + public static class NonuniqueMultiplicityExpressionContext extends ParserRuleContext { + public TerminalNode NONUNIQUE_SUFFIX() { return getToken(DirectEditParser.NONUNIQUE_SUFFIX, 0); } + public NonuniqueMultiplicityExpressionContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_nonuniqueMultiplicityExpression; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof DirectEditListener ) ((DirectEditListener)listener).enterNonuniqueMultiplicityExpression(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof DirectEditListener ) ((DirectEditListener)listener).exitNonuniqueMultiplicityExpression(this); + } + } + + public final NonuniqueMultiplicityExpressionContext nonuniqueMultiplicityExpression() throws RecognitionException { + NonuniqueMultiplicityExpressionContext _localctx = new NonuniqueMultiplicityExpressionContext(_ctx, getState()); + enterRule(_localctx, 24, RULE_nonuniqueMultiplicityExpression); + try { + enterOuterAlt(_localctx, 1); + { + setState(121); + match(NONUNIQUE_SUFFIX); } } catch (RecognitionException re) { @@ -357,14 +879,14 @@ public void exitRule(ParseTreeListener listener) { public final MultiplicityExpressionMemberContext multiplicityExpressionMember() throws RecognitionException { MultiplicityExpressionMemberContext _localctx = new MultiplicityExpressionMemberContext(_ctx, getState()); - enterRule(_localctx, 6, RULE_multiplicityExpressionMember); + enterRule(_localctx, 26, RULE_multiplicityExpressionMember); int _la; try { enterOuterAlt(_localctx, 1); { - setState(57); + setState(123); _la = _input.LA(1); - if ( !(_la==T__4 || _la==Integer) ) { + if ( !(_la==T__3 || _la==Integer) ) { _errHandler.recoverInline(this); } else { @@ -414,53 +936,53 @@ public void exitRule(ParseTreeListener listener) { public final FeatureExpressionsContext featureExpressions() throws RecognitionException { FeatureExpressionsContext _localctx = new FeatureExpressionsContext(_ctx, getState()); - enterRule(_localctx, 8, RULE_featureExpressions); + enterRule(_localctx, 28, RULE_featureExpressions); int _la; try { - setState(79); + setState(145); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,10,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,20,_ctx) ) { case 1: enterOuterAlt(_localctx, 1); { - setState(61); + setState(127); _errHandler.sync(this); switch (_input.LA(1)) { - case T__5: + case T__4: { - setState(59); + setState(125); subsettingExpression(); } break; - case T__6: + case T__5: { - setState(60); + setState(126); redefinitionExpression(); } break; case EOF: + case T__6: case T__7: - case T__8: break; default: break; } - setState(64); + setState(130); _errHandler.sync(this); _la = _input.LA(1); - if (_la==T__7) { + if (_la==T__6) { { - setState(63); + setState(129); typingExpression(); } } - setState(67); + setState(133); _errHandler.sync(this); _la = _input.LA(1); - if (_la==T__8) { + if (_la==T__7) { { - setState(66); + setState(132); valueExpression(); } } @@ -470,43 +992,43 @@ public final FeatureExpressionsContext featureExpressions() throws RecognitionEx case 2: enterOuterAlt(_localctx, 2); { - setState(70); + setState(136); _errHandler.sync(this); _la = _input.LA(1); - if (_la==T__7) { + if (_la==T__6) { { - setState(69); + setState(135); typingExpression(); } } - setState(74); + setState(140); _errHandler.sync(this); switch (_input.LA(1)) { - case T__5: + case T__4: { - setState(72); + setState(138); subsettingExpression(); } break; - case T__6: + case T__5: { - setState(73); + setState(139); redefinitionExpression(); } break; case EOF: - case T__8: + case T__7: break; default: break; } - setState(77); + setState(143); _errHandler.sync(this); _la = _input.LA(1); - if (_la==T__8) { + if (_la==T__7) { { - setState(76); + setState(142); valueExpression(); } } @@ -546,13 +1068,13 @@ public void exitRule(ParseTreeListener listener) { public final SubsettingExpressionContext subsettingExpression() throws RecognitionException { SubsettingExpressionContext _localctx = new SubsettingExpressionContext(_ctx, getState()); - enterRule(_localctx, 10, RULE_subsettingExpression); + enterRule(_localctx, 30, RULE_subsettingExpression); try { enterOuterAlt(_localctx, 1); { - setState(81); - match(T__5); - setState(82); + setState(147); + match(T__4); + setState(148); qualifiedName(); } } @@ -587,13 +1109,13 @@ public void exitRule(ParseTreeListener listener) { public final RedefinitionExpressionContext redefinitionExpression() throws RecognitionException { RedefinitionExpressionContext _localctx = new RedefinitionExpressionContext(_ctx, getState()); - enterRule(_localctx, 12, RULE_redefinitionExpression); + enterRule(_localctx, 32, RULE_redefinitionExpression); try { enterOuterAlt(_localctx, 1); { - setState(84); - match(T__6); - setState(85); + setState(150); + match(T__5); + setState(151); qualifiedName(); } } @@ -628,13 +1150,13 @@ public void exitRule(ParseTreeListener listener) { public final TypingExpressionContext typingExpression() throws RecognitionException { TypingExpressionContext _localctx = new TypingExpressionContext(_ctx, getState()); - enterRule(_localctx, 14, RULE_typingExpression); + enterRule(_localctx, 34, RULE_typingExpression); try { enterOuterAlt(_localctx, 1); { - setState(87); - match(T__7); - setState(88); + setState(153); + match(T__6); + setState(154); qualifiedName(); } } @@ -673,14 +1195,14 @@ public void exitRule(ParseTreeListener listener) { public final ValueExpressionContext valueExpression() throws RecognitionException { ValueExpressionContext _localctx = new ValueExpressionContext(_ctx, getState()); - enterRule(_localctx, 16, RULE_valueExpression); + enterRule(_localctx, 36, RULE_valueExpression); int _la; try { enterOuterAlt(_localctx, 1); { - setState(90); - match(T__8); - setState(91); + setState(156); + match(T__7); + setState(157); _la = _input.LA(1); if ( !((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << Boolean) | (1L << Integer) | (1L << Real) | (1L << DoubleQuotedString))) != 0)) ) { _errHandler.recoverInline(this); @@ -690,17 +1212,17 @@ public final ValueExpressionContext valueExpression() throws RecognitionExceptio _errHandler.reportMatch(this); consume(); } - setState(96); + setState(162); _errHandler.sync(this); _la = _input.LA(1); - if (_la==T__1) { + if (_la==T__0) { { - setState(92); - match(T__1); - setState(93); + setState(158); + match(T__0); + setState(159); measurementExpression(); - setState(94); - match(T__3); + setState(160); + match(T__2); } } @@ -734,20 +1256,20 @@ public void exitRule(ParseTreeListener listener) { public final MeasurementExpressionContext measurementExpression() throws RecognitionException { MeasurementExpressionContext _localctx = new MeasurementExpressionContext(_ctx, getState()); - enterRule(_localctx, 18, RULE_measurementExpression); + enterRule(_localctx, 38, RULE_measurementExpression); int _la; try { enterOuterAlt(_localctx, 1); { - setState(99); + setState(165); _errHandler.sync(this); _la = _input.LA(1); do { { { - setState(98); + setState(164); _la = _input.LA(1); - if ( _la <= 0 || (_la==T__3) ) { + if ( _la <= 0 || (_la==T__2) ) { _errHandler.recoverInline(this); } else { @@ -757,10 +1279,10 @@ public final MeasurementExpressionContext measurementExpression() throws Recogni } } } - setState(101); + setState(167); _errHandler.sync(this); _la = _input.LA(1); - } while ( (((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << T__0) | (1L << T__1) | (1L << T__2) | (1L << T__4) | (1L << T__5) | (1L << T__6) | (1L << T__7) | (1L << T__8) | (1L << T__9) | (1L << T__10) | (1L << T__11) | (1L << T__12) | (1L << T__13) | (1L << WS) | (1L << Boolean) | (1L << Integer) | (1L << Real) | (1L << DoubleQuotedString) | (1L << ABOUT) | (1L << ABSTRACT) | (1L << ALIAS) | (1L << ALL) | (1L << AND) | (1L << AS) | (1L << ASSIGN) | (1L << ASSOC) | (1L << BEAHVIOR) | (1L << BINDING) | (1L << BOOL) | (1L << BY) | (1L << CHAINS) | (1L << CLASS) | (1L << CLASSIFIER) | (1L << COMMENT) | (1L << COMPOSITE) | (1L << CONJUGATE) | (1L << CONJUGATES) | (1L << CONJUGATION) | (1L << CONNECTOR) | (1L << DATATYPE) | (1L << DEFAULT) | (1L << DEPENDENCY) | (1L << DERIVED) | (1L << DIFFERENCES) | (1L << DISJOINING) | (1L << DISJOINT) | (1L << DOC) | (1L << ELSE) | (1L << END) | (1L << EXPR) | (1L << FALSE) | (1L << FEATURE) | (1L << FEATURED) | (1L << FEATURING) | (1L << FILTER) | (1L << FIRST) | (1L << FLOW) | (1L << FOR) | (1L << FROM) | (1L << FUNCTION) | (1L << HASTYPE) | (1L << IF))) != 0) || ((((_la - 64)) & ~0x3f) == 0 && ((1L << (_la - 64)) & ((1L << (INTERSECTS - 64)) | (1L << (IMPLIES - 64)) | (1L << (IMPORT - 64)) | (1L << (IN - 64)) | (1L << (INPUT - 64)) | (1L << (INTERACTION - 64)) | (1L << (INV - 64)) | (1L << (INVERSE - 64)) | (1L << (INVERTING - 64)) | (1L << (ISTYPE - 64)) | (1L << (LANGUAGE - 64)) | (1L << (MEMBER - 64)) | (1L << (METACLASS - 64)) | (1L << (METADATA - 64)) | (1L << (MULTIPLICITY - 64)) | (1L << (NAMESPACE - 64)) | (1L << (NONUNIQUE - 64)) | (1L << (NOT - 64)) | (1L << (NULL - 64)) | (1L << (OF - 64)) | (1L << (OR - 64)) | (1L << (ORDERED - 64)) | (1L << (OUT - 64)) | (1L << (PACKAGE - 64)) | (1L << (PORTION - 64)) | (1L << (PREDICATE - 64)) | (1L << (PRIAVTE - 64)) | (1L << (PROTECTED - 64)) | (1L << (PUBLIC - 64)) | (1L << (READONLY - 64)) | (1L << (REDEFINES - 64)) | (1L << (REDEFINITION - 64)) | (1L << (RFERENCES - 64)) | (1L << (REP - 64)) | (1L << (RETURN - 64)) | (1L << (SPECIALIZTION - 64)) | (1L << (SPECIALIZES - 64)) | (1L << (STEP - 64)) | (1L << (STRCUT - 64)) | (1L << (SUBCLASSIFIER - 64)) | (1L << (SUBSET - 64)) | (1L << (SUBSETS - 64)) | (1L << (SUBTYPE - 64)) | (1L << (SUCCESSION - 64)) | (1L << (THEN - 64)) | (1L << (TO - 64)) | (1L << (TRUE - 64)) | (1L << (TYPE - 64)) | (1L << (TYPED - 64)) | (1L << (TYPING - 64)) | (1L << (UNIONS - 64)) | (1L << (XOR - 64)) | (1L << (ANY - 64)))) != 0) ); + } while ( ((((_la - 1)) & ~0x3f) == 0 && ((1L << (_la - 1)) & ((1L << (T__0 - 1)) | (1L << (T__1 - 1)) | (1L << (T__3 - 1)) | (1L << (T__4 - 1)) | (1L << (T__5 - 1)) | (1L << (T__6 - 1)) | (1L << (T__7 - 1)) | (1L << (T__8 - 1)) | (1L << (T__9 - 1)) | (1L << (T__10 - 1)) | (1L << (T__11 - 1)) | (1L << (T__12 - 1)) | (1L << (WS - 1)) | (1L << (Boolean - 1)) | (1L << (Integer - 1)) | (1L << (Real - 1)) | (1L << (DoubleQuotedString - 1)) | (1L << (ABOUT - 1)) | (1L << (ABSTRACT - 1)) | (1L << (ABSTRACT_PREFIX - 1)) | (1L << (ALIAS - 1)) | (1L << (ALL - 1)) | (1L << (AND - 1)) | (1L << (AS - 1)) | (1L << (ASSIGN - 1)) | (1L << (ASSOC - 1)) | (1L << (BEAHVIOR - 1)) | (1L << (BINDING - 1)) | (1L << (BOOL - 1)) | (1L << (BY - 1)) | (1L << (CHAINS - 1)) | (1L << (CLASS - 1)) | (1L << (CLASSIFIER - 1)) | (1L << (COMMENT - 1)) | (1L << (COMPOSITE - 1)) | (1L << (CONJUGATE - 1)) | (1L << (CONJUGATES - 1)) | (1L << (CONJUGATION - 1)) | (1L << (CONNECTOR - 1)) | (1L << (DATATYPE - 1)) | (1L << (DEFAULT - 1)) | (1L << (DEPENDENCY - 1)) | (1L << (DERIVED - 1)) | (1L << (DERIVED_PREFIX - 1)) | (1L << (DIFFERENCES - 1)) | (1L << (DISJOINING - 1)) | (1L << (DISJOINT - 1)) | (1L << (DOC - 1)) | (1L << (ELSE - 1)) | (1L << (END - 1)) | (1L << (END_PREFIX - 1)) | (1L << (EXPR - 1)) | (1L << (FALSE - 1)) | (1L << (FEATURE - 1)) | (1L << (FEATURED - 1)) | (1L << (FEATURING - 1)) | (1L << (FILTER - 1)) | (1L << (FIRST - 1)) | (1L << (FLOW - 1)) | (1L << (FOR - 1)) | (1L << (FROM - 1)) | (1L << (FUNCTION - 1)) | (1L << (HASTYPE - 1)))) != 0) || ((((_la - 65)) & ~0x3f) == 0 && ((1L << (_la - 65)) & ((1L << (IF - 65)) | (1L << (INTERSECTS - 65)) | (1L << (IMPLIES - 65)) | (1L << (IMPORT - 65)) | (1L << (IN - 65)) | (1L << (IN_PREFIX - 65)) | (1L << (INOUT - 65)) | (1L << (INOUT_PREFIX - 65)) | (1L << (INTERACTION - 65)) | (1L << (INV - 65)) | (1L << (INVERSE - 65)) | (1L << (INVERTING - 65)) | (1L << (ISTYPE - 65)) | (1L << (LANGUAGE - 65)) | (1L << (MEMBER - 65)) | (1L << (METACLASS - 65)) | (1L << (METADATA - 65)) | (1L << (MULTIPLICITY - 65)) | (1L << (NAMESPACE - 65)) | (1L << (NONUNIQUE - 65)) | (1L << (NONUNIQUE_SUFFIX - 65)) | (1L << (NOT - 65)) | (1L << (NULL - 65)) | (1L << (OF - 65)) | (1L << (OR - 65)) | (1L << (ORDERED - 65)) | (1L << (ORDERED_SUFFIX - 65)) | (1L << (OUT - 65)) | (1L << (OUT_PREFIX - 65)) | (1L << (PACKAGE - 65)) | (1L << (PORTION - 65)) | (1L << (PREDICATE - 65)) | (1L << (PRIAVTE - 65)) | (1L << (PROTECTED - 65)) | (1L << (PUBLIC - 65)) | (1L << (READONLY - 65)) | (1L << (READONLY_PREFIX - 65)) | (1L << (REDEFINES - 65)) | (1L << (REDEFINITION - 65)) | (1L << (REF - 65)) | (1L << (REF_PREFIX - 65)) | (1L << (REFERENCES - 65)) | (1L << (REP - 65)) | (1L << (RETURN - 65)) | (1L << (SPECIALIZTION - 65)) | (1L << (SPECIALIZES - 65)) | (1L << (STEP - 65)) | (1L << (STRCUT - 65)) | (1L << (SUBCLASSIFIER - 65)) | (1L << (SUBSET - 65)) | (1L << (SUBSETS - 65)) | (1L << (SUBTYPE - 65)) | (1L << (SUCCESSION - 65)) | (1L << (THEN - 65)) | (1L << (TO - 65)) | (1L << (TRUE - 65)) | (1L << (TYPE - 65)) | (1L << (TYPED - 65)) | (1L << (TYPING - 65)) | (1L << (UNIONS - 65)) | (1L << (VARIATION - 65)) | (1L << (VARIATION_PREFIX - 65)) | (1L << (XOR - 65)) | (1L << (ANY - 65)))) != 0) ); } } catch (RecognitionException re) { @@ -800,37 +1322,37 @@ public void exitRule(ParseTreeListener listener) { public final TransitionExpressionContext transitionExpression() throws RecognitionException { TransitionExpressionContext _localctx = new TransitionExpressionContext(_ctx, getState()); - enterRule(_localctx, 20, RULE_transitionExpression); + enterRule(_localctx, 40, RULE_transitionExpression); int _la; try { enterOuterAlt(_localctx, 1); { - setState(104); + setState(170); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,13,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,23,_ctx) ) { case 1: { - setState(103); + setState(169); triggerExpression(); } break; } - setState(107); + setState(173); _errHandler.sync(this); _la = _input.LA(1); - if (_la==T__1) { + if (_la==T__0) { { - setState(106); + setState(172); guardExpression(); } } - setState(110); + setState(176); _errHandler.sync(this); _la = _input.LA(1); - if (_la==T__10) { + if (_la==T__9) { { - setState(109); + setState(175); effectExpression(); } } @@ -871,26 +1393,26 @@ public void exitRule(ParseTreeListener listener) { public final TriggerExpressionContext triggerExpression() throws RecognitionException { TriggerExpressionContext _localctx = new TriggerExpressionContext(_ctx, getState()); - enterRule(_localctx, 22, RULE_triggerExpression); + enterRule(_localctx, 42, RULE_triggerExpression); int _la; try { enterOuterAlt(_localctx, 1); { - setState(112); + setState(178); triggerExpressionName(); - setState(117); + setState(183); _errHandler.sync(this); _la = _input.LA(1); - while (_la==T__9) { + while (_la==T__8) { { { - setState(113); - match(T__9); - setState(114); + setState(179); + match(T__8); + setState(180); triggerExpressionName(); } } - setState(119); + setState(185); _errHandler.sync(this); _la = _input.LA(1); } @@ -930,19 +1452,19 @@ public void exitRule(ParseTreeListener listener) { public final TriggerExpressionNameContext triggerExpressionName() throws RecognitionException { TriggerExpressionNameContext _localctx = new TriggerExpressionNameContext(_ctx, getState()); - enterRule(_localctx, 24, RULE_triggerExpressionName); + enterRule(_localctx, 44, RULE_triggerExpressionName); int _la; try { enterOuterAlt(_localctx, 1); { - setState(120); + setState(186); name(); - setState(122); + setState(188); _errHandler.sync(this); _la = _input.LA(1); - if (_la==T__7) { + if (_la==T__6) { { - setState(121); + setState(187); typingExpression(); } } @@ -980,16 +1502,16 @@ public void exitRule(ParseTreeListener listener) { public final GuardExpressionContext guardExpression() throws RecognitionException { GuardExpressionContext _localctx = new GuardExpressionContext(_ctx, getState()); - enterRule(_localctx, 26, RULE_guardExpression); + enterRule(_localctx, 46, RULE_guardExpression); try { enterOuterAlt(_localctx, 1); { - setState(124); - match(T__1); - setState(125); + setState(190); + match(T__0); + setState(191); valueExpression(); - setState(126); - match(T__3); + setState(192); + match(T__2); } } catch (RecognitionException re) { @@ -1026,28 +1548,28 @@ public void exitRule(ParseTreeListener listener) { public final EffectExpressionContext effectExpression() throws RecognitionException { EffectExpressionContext _localctx = new EffectExpressionContext(_ctx, getState()); - enterRule(_localctx, 28, RULE_effectExpression); + enterRule(_localctx, 48, RULE_effectExpression); int _la; try { enterOuterAlt(_localctx, 1); { - setState(128); - match(T__10); - setState(129); + setState(194); + match(T__9); + setState(195); qualifiedName(); - setState(134); + setState(200); _errHandler.sync(this); _la = _input.LA(1); - while (_la==T__11) { + while (_la==T__10) { { { - setState(130); - match(T__11); - setState(131); + setState(196); + match(T__10); + setState(197); qualifiedName(); } } - setState(136); + setState(202); _errHandler.sync(this); _la = _input.LA(1); } @@ -1087,26 +1609,26 @@ public void exitRule(ParseTreeListener listener) { public final QualifiedNameContext qualifiedName() throws RecognitionException { QualifiedNameContext _localctx = new QualifiedNameContext(_ctx, getState()); - enterRule(_localctx, 30, RULE_qualifiedName); + enterRule(_localctx, 50, RULE_qualifiedName); int _la; try { enterOuterAlt(_localctx, 1); { - setState(137); + setState(203); name(); - setState(142); + setState(208); _errHandler.sync(this); _la = _input.LA(1); - while (_la==T__12) { + while (_la==T__11) { { { - setState(138); - match(T__12); - setState(139); + setState(204); + match(T__11); + setState(205); name(); } } - setState(144); + setState(210); _errHandler.sync(this); _la = _input.LA(1); } @@ -1124,6 +1646,14 @@ public final QualifiedNameContext qualifiedName() throws RecognitionException { } public static class NameContext extends ParserRuleContext { + public List ORDERED_SUFFIX() { return getTokens(DirectEditParser.ORDERED_SUFFIX); } + public TerminalNode ORDERED_SUFFIX(int i) { + return getToken(DirectEditParser.ORDERED_SUFFIX, i); + } + public List NONUNIQUE_SUFFIX() { return getTokens(DirectEditParser.NONUNIQUE_SUFFIX); } + public TerminalNode NONUNIQUE_SUFFIX(int i) { + return getToken(DirectEditParser.NONUNIQUE_SUFFIX, i); + } public NameContext(ParserRuleContext parent, int invokingState) { super(parent, invokingState); } @@ -1140,13 +1670,13 @@ public void exitRule(ParseTreeListener listener) { public final NameContext name() throws RecognitionException { NameContext _localctx = new NameContext(_ctx, getState()); - enterRule(_localctx, 32, RULE_name); + enterRule(_localctx, 52, RULE_name); int _la; try { int _alt; enterOuterAlt(_localctx, 1); { - setState(146); + setState(212); _errHandler.sync(this); _alt = 1; do { @@ -1154,9 +1684,9 @@ public final NameContext name() throws RecognitionException { case 1: { { - setState(145); + setState(211); _la = _input.LA(1); - if ( _la <= 0 || ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << T__0) | (1L << T__1) | (1L << T__5) | (1L << T__6) | (1L << T__7) | (1L << T__8) | (1L << T__13))) != 0)) ) { + if ( _la <= 0 || ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << T__0) | (1L << T__4) | (1L << T__5) | (1L << T__6) | (1L << T__7) | (1L << T__12))) != 0) || _la==NONUNIQUE_SUFFIX || _la==ORDERED_SUFFIX) ) { _errHandler.recoverInline(this); } else { @@ -1170,9 +1700,9 @@ public final NameContext name() throws RecognitionException { default: throw new NoViableAltException(this); } - setState(148); + setState(214); _errHandler.sync(this); - _alt = getInterpreter().adaptivePredict(_input,20,_ctx); + _alt = getInterpreter().adaptivePredict(_input,30,_ctx); } while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ); } } @@ -1188,94 +1718,141 @@ public final NameContext name() throws RecognitionException { } public static final String _serializedATN = - "\u0004\u0001t\u0097\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"+ - "\f\u0007\f\u0002\r\u0007\r\u0002\u000e\u0007\u000e\u0002\u000f\u0007\u000f"+ - "\u0002\u0010\u0007\u0010\u0001\u0000\u0003\u0000$\b\u0000\u0001\u0000"+ - "\u0003\u0000\'\b\u0000\u0001\u0000\u0003\u0000*\b\u0000\u0001\u0000\u0001"+ - "\u0000\u0001\u0000\u0001\u0001\u0001\u0001\u0001\u0002\u0001\u0002\u0001"+ - "\u0002\u0001\u0002\u0003\u00025\b\u0002\u0001\u0002\u0001\u0002\u0001"+ - "\u0002\u0001\u0003\u0001\u0003\u0001\u0004\u0001\u0004\u0003\u0004>\b"+ - "\u0004\u0001\u0004\u0003\u0004A\b\u0004\u0001\u0004\u0003\u0004D\b\u0004"+ - "\u0001\u0004\u0003\u0004G\b\u0004\u0001\u0004\u0001\u0004\u0003\u0004"+ - "K\b\u0004\u0001\u0004\u0003\u0004N\b\u0004\u0003\u0004P\b\u0004\u0001"+ - "\u0005\u0001\u0005\u0001\u0005\u0001\u0006\u0001\u0006\u0001\u0006\u0001"+ - "\u0007\u0001\u0007\u0001\u0007\u0001\b\u0001\b\u0001\b\u0001\b\u0001\b"+ - "\u0001\b\u0003\ba\b\b\u0001\t\u0004\td\b\t\u000b\t\f\te\u0001\n\u0003"+ - "\ni\b\n\u0001\n\u0003\nl\b\n\u0001\n\u0003\no\b\n\u0001\u000b\u0001\u000b"+ - "\u0001\u000b\u0005\u000bt\b\u000b\n\u000b\f\u000bw\t\u000b\u0001\f\u0001"+ - "\f\u0003\f{\b\f\u0001\r\u0001\r\u0001\r\u0001\r\u0001\u000e\u0001\u000e"+ - "\u0001\u000e\u0001\u000e\u0005\u000e\u0085\b\u000e\n\u000e\f\u000e\u0088"+ - "\t\u000e\u0001\u000f\u0001\u000f\u0001\u000f\u0005\u000f\u008d\b\u000f"+ - "\n\u000f\f\u000f\u0090\t\u000f\u0001\u0010\u0004\u0010\u0093\b\u0010\u000b"+ - "\u0010\f\u0010\u0094\u0001\u0010\u0000\u0000\u0011\u0000\u0002\u0004\u0006"+ - "\b\n\f\u000e\u0010\u0012\u0014\u0016\u0018\u001a\u001c\u001e \u0000\u0004"+ - "\u0002\u0000\u0005\u0005\u0011\u0011\u0001\u0000\u0010\u0013\u0001\u0000"+ - "\u0004\u0004\u0003\u0000\u0001\u0002\u0006\t\u000e\u000e\u009c\u0000#"+ - "\u0001\u0000\u0000\u0000\u0002.\u0001\u0000\u0000\u0000\u00040\u0001\u0000"+ - "\u0000\u0000\u00069\u0001\u0000\u0000\u0000\bO\u0001\u0000\u0000\u0000"+ - "\nQ\u0001\u0000\u0000\u0000\fT\u0001\u0000\u0000\u0000\u000eW\u0001\u0000"+ - "\u0000\u0000\u0010Z\u0001\u0000\u0000\u0000\u0012c\u0001\u0000\u0000\u0000"+ - "\u0014h\u0001\u0000\u0000\u0000\u0016p\u0001\u0000\u0000\u0000\u0018x"+ - "\u0001\u0000\u0000\u0000\u001a|\u0001\u0000\u0000\u0000\u001c\u0080\u0001"+ - "\u0000\u0000\u0000\u001e\u0089\u0001\u0000\u0000\u0000 \u0092\u0001\u0000"+ - "\u0000\u0000\"$\u0003\u0002\u0001\u0000#\"\u0001\u0000\u0000\u0000#$\u0001"+ - "\u0000\u0000\u0000$&\u0001\u0000\u0000\u0000%\'\u0003 \u0010\u0000&%\u0001"+ - "\u0000\u0000\u0000&\'\u0001\u0000\u0000\u0000\')\u0001\u0000\u0000\u0000"+ - "(*\u0003\u0004\u0002\u0000)(\u0001\u0000\u0000\u0000)*\u0001\u0000\u0000"+ - "\u0000*+\u0001\u0000\u0000\u0000+,\u0003\b\u0004\u0000,-\u0005\u0000\u0000"+ - "\u0001-\u0001\u0001\u0000\u0000\u0000./\u0005\u0001\u0000\u0000/\u0003"+ - "\u0001\u0000\u0000\u000004\u0005\u0002\u0000\u000012\u0003\u0006\u0003"+ - "\u000023\u0005\u0003\u0000\u000035\u0001\u0000\u0000\u000041\u0001\u0000"+ - "\u0000\u000045\u0001\u0000\u0000\u000056\u0001\u0000\u0000\u000067\u0003"+ - "\u0006\u0003\u000078\u0005\u0004\u0000\u00008\u0005\u0001\u0000\u0000"+ - "\u00009:\u0007\u0000\u0000\u0000:\u0007\u0001\u0000\u0000\u0000;>\u0003"+ - "\n\u0005\u0000<>\u0003\f\u0006\u0000=;\u0001\u0000\u0000\u0000=<\u0001"+ - "\u0000\u0000\u0000=>\u0001\u0000\u0000\u0000>@\u0001\u0000\u0000\u0000"+ - "?A\u0003\u000e\u0007\u0000@?\u0001\u0000\u0000\u0000@A\u0001\u0000\u0000"+ - "\u0000AC\u0001\u0000\u0000\u0000BD\u0003\u0010\b\u0000CB\u0001\u0000\u0000"+ - "\u0000CD\u0001\u0000\u0000\u0000DP\u0001\u0000\u0000\u0000EG\u0003\u000e"+ - "\u0007\u0000FE\u0001\u0000\u0000\u0000FG\u0001\u0000\u0000\u0000GJ\u0001"+ - "\u0000\u0000\u0000HK\u0003\n\u0005\u0000IK\u0003\f\u0006\u0000JH\u0001"+ - "\u0000\u0000\u0000JI\u0001\u0000\u0000\u0000JK\u0001\u0000\u0000\u0000"+ - "KM\u0001\u0000\u0000\u0000LN\u0003\u0010\b\u0000ML\u0001\u0000\u0000\u0000"+ - "MN\u0001\u0000\u0000\u0000NP\u0001\u0000\u0000\u0000O=\u0001\u0000\u0000"+ - "\u0000OF\u0001\u0000\u0000\u0000P\t\u0001\u0000\u0000\u0000QR\u0005\u0006"+ - "\u0000\u0000RS\u0003\u001e\u000f\u0000S\u000b\u0001\u0000\u0000\u0000"+ - "TU\u0005\u0007\u0000\u0000UV\u0003\u001e\u000f\u0000V\r\u0001\u0000\u0000"+ - "\u0000WX\u0005\b\u0000\u0000XY\u0003\u001e\u000f\u0000Y\u000f\u0001\u0000"+ - "\u0000\u0000Z[\u0005\t\u0000\u0000[`\u0007\u0001\u0000\u0000\\]\u0005"+ - "\u0002\u0000\u0000]^\u0003\u0012\t\u0000^_\u0005\u0004\u0000\u0000_a\u0001"+ - "\u0000\u0000\u0000`\\\u0001\u0000\u0000\u0000`a\u0001\u0000\u0000\u0000"+ - "a\u0011\u0001\u0000\u0000\u0000bd\b\u0002\u0000\u0000cb\u0001\u0000\u0000"+ - "\u0000de\u0001\u0000\u0000\u0000ec\u0001\u0000\u0000\u0000ef\u0001\u0000"+ - "\u0000\u0000f\u0013\u0001\u0000\u0000\u0000gi\u0003\u0016\u000b\u0000"+ - "hg\u0001\u0000\u0000\u0000hi\u0001\u0000\u0000\u0000ik\u0001\u0000\u0000"+ - "\u0000jl\u0003\u001a\r\u0000kj\u0001\u0000\u0000\u0000kl\u0001\u0000\u0000"+ - "\u0000ln\u0001\u0000\u0000\u0000mo\u0003\u001c\u000e\u0000nm\u0001\u0000"+ - "\u0000\u0000no\u0001\u0000\u0000\u0000o\u0015\u0001\u0000\u0000\u0000"+ - "pu\u0003\u0018\f\u0000qr\u0005\n\u0000\u0000rt\u0003\u0018\f\u0000sq\u0001"+ - "\u0000\u0000\u0000tw\u0001\u0000\u0000\u0000us\u0001\u0000\u0000\u0000"+ - "uv\u0001\u0000\u0000\u0000v\u0017\u0001\u0000\u0000\u0000wu\u0001\u0000"+ - "\u0000\u0000xz\u0003 \u0010\u0000y{\u0003\u000e\u0007\u0000zy\u0001\u0000"+ - "\u0000\u0000z{\u0001\u0000\u0000\u0000{\u0019\u0001\u0000\u0000\u0000"+ - "|}\u0005\u0002\u0000\u0000}~\u0003\u0010\b\u0000~\u007f\u0005\u0004\u0000"+ - "\u0000\u007f\u001b\u0001\u0000\u0000\u0000\u0080\u0081\u0005\u000b\u0000"+ - "\u0000\u0081\u0086\u0003\u001e\u000f\u0000\u0082\u0083\u0005\f\u0000\u0000"+ - "\u0083\u0085\u0003\u001e\u000f\u0000\u0084\u0082\u0001\u0000\u0000\u0000"+ - "\u0085\u0088\u0001\u0000\u0000\u0000\u0086\u0084\u0001\u0000\u0000\u0000"+ - "\u0086\u0087\u0001\u0000\u0000\u0000\u0087\u001d\u0001\u0000\u0000\u0000"+ - "\u0088\u0086\u0001\u0000\u0000\u0000\u0089\u008e\u0003 \u0010\u0000\u008a"+ - "\u008b\u0005\r\u0000\u0000\u008b\u008d\u0003 \u0010\u0000\u008c\u008a"+ - "\u0001\u0000\u0000\u0000\u008d\u0090\u0001\u0000\u0000\u0000\u008e\u008c"+ - "\u0001\u0000\u0000\u0000\u008e\u008f\u0001\u0000\u0000\u0000\u008f\u001f"+ - "\u0001\u0000\u0000\u0000\u0090\u008e\u0001\u0000\u0000\u0000\u0091\u0093"+ - "\b\u0003\u0000\u0000\u0092\u0091\u0001\u0000\u0000\u0000\u0093\u0094\u0001"+ - "\u0000\u0000\u0000\u0094\u0092\u0001\u0000\u0000\u0000\u0094\u0095\u0001"+ - "\u0000\u0000\u0000\u0095!\u0001\u0000\u0000\u0000\u0015#&)4=@CFJMO`eh"+ - "knuz\u0086\u008e\u0094"; + "\u0004\u0001\u0080\u00d9\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\f\u0007\f\u0002\r\u0007\r\u0002\u000e\u0007\u000e\u0002\u000f\u0007"+ + "\u000f\u0002\u0010\u0007\u0010\u0002\u0011\u0007\u0011\u0002\u0012\u0007"+ + "\u0012\u0002\u0013\u0007\u0013\u0002\u0014\u0007\u0014\u0002\u0015\u0007"+ + "\u0015\u0002\u0016\u0007\u0016\u0002\u0017\u0007\u0017\u0002\u0018\u0007"+ + "\u0018\u0002\u0019\u0007\u0019\u0002\u001a\u0007\u001a\u0001\u0000\u0003"+ + "\u00008\b\u0000\u0001\u0000\u0003\u0000;\b\u0000\u0001\u0000\u0003\u0000"+ + ">\b\u0000\u0001\u0000\u0003\u0000A\b\u0000\u0001\u0000\u0003\u0000D\b"+ + "\u0000\u0001\u0000\u0001\u0000\u0001\u0000\u0001\u0001\u0003\u0001J\b"+ + "\u0001\u0001\u0001\u0003\u0001M\b\u0001\u0001\u0001\u0003\u0001P\b\u0001"+ + "\u0001\u0001\u0003\u0001S\b\u0001\u0001\u0001\u0003\u0001V\b\u0001\u0001"+ + "\u0001\u0003\u0001Y\b\u0001\u0001\u0002\u0001\u0002\u0001\u0003\u0001"+ + "\u0003\u0001\u0004\u0001\u0004\u0001\u0005\u0001\u0005\u0001\u0006\u0001"+ + "\u0006\u0001\u0007\u0001\u0007\u0001\b\u0001\b\u0001\t\u0001\t\u0001\t"+ + "\u0001\t\u0003\tm\b\t\u0001\t\u0001\t\u0001\t\u0001\n\u0003\ns\b\n\u0001"+ + "\n\u0003\nv\b\n\u0001\u000b\u0001\u000b\u0001\f\u0001\f\u0001\r\u0001"+ + "\r\u0001\u000e\u0001\u000e\u0003\u000e\u0080\b\u000e\u0001\u000e\u0003"+ + "\u000e\u0083\b\u000e\u0001\u000e\u0003\u000e\u0086\b\u000e\u0001\u000e"+ + "\u0003\u000e\u0089\b\u000e\u0001\u000e\u0001\u000e\u0003\u000e\u008d\b"+ + "\u000e\u0001\u000e\u0003\u000e\u0090\b\u000e\u0003\u000e\u0092\b\u000e"+ + "\u0001\u000f\u0001\u000f\u0001\u000f\u0001\u0010\u0001\u0010\u0001\u0010"+ + "\u0001\u0011\u0001\u0011\u0001\u0011\u0001\u0012\u0001\u0012\u0001\u0012"+ + "\u0001\u0012\u0001\u0012\u0001\u0012\u0003\u0012\u00a3\b\u0012\u0001\u0013"+ + "\u0004\u0013\u00a6\b\u0013\u000b\u0013\f\u0013\u00a7\u0001\u0014\u0003"+ + "\u0014\u00ab\b\u0014\u0001\u0014\u0003\u0014\u00ae\b\u0014\u0001\u0014"+ + "\u0003\u0014\u00b1\b\u0014\u0001\u0015\u0001\u0015\u0001\u0015\u0005\u0015"+ + "\u00b6\b\u0015\n\u0015\f\u0015\u00b9\t\u0015\u0001\u0016\u0001\u0016\u0003"+ + "\u0016\u00bd\b\u0016\u0001\u0017\u0001\u0017\u0001\u0017\u0001\u0017\u0001"+ + "\u0018\u0001\u0018\u0001\u0018\u0001\u0018\u0005\u0018\u00c7\b\u0018\n"+ + "\u0018\f\u0018\u00ca\t\u0018\u0001\u0019\u0001\u0019\u0001\u0019\u0005"+ + "\u0019\u00cf\b\u0019\n\u0019\f\u0019\u00d2\t\u0019\u0001\u001a\u0004\u001a"+ + "\u00d5\b\u001a\u000b\u001a\f\u001a\u00d6\u0001\u001a\u0000\u0000\u001b"+ + "\u0000\u0002\u0004\u0006\b\n\f\u000e\u0010\u0012\u0014\u0016\u0018\u001a"+ + "\u001c\u001e \"$&(*,.024\u0000\u0005\u0003\u0000FFHH]]\u0002\u0000\u0004"+ + "\u0004\u0010\u0010\u0001\u0000\u000f\u0012\u0001\u0000\u0003\u0003\u0005"+ + "\u0000\u0001\u0001\u0005\b\r\rUU[[\u00de\u00007\u0001\u0000\u0000\u0000"+ + "\u0002I\u0001\u0000\u0000\u0000\u0004Z\u0001\u0000\u0000\u0000\u0006\\"+ + "\u0001\u0000\u0000\u0000\b^\u0001\u0000\u0000\u0000\n`\u0001\u0000\u0000"+ + "\u0000\fb\u0001\u0000\u0000\u0000\u000ed\u0001\u0000\u0000\u0000\u0010"+ + "f\u0001\u0000\u0000\u0000\u0012h\u0001\u0000\u0000\u0000\u0014r\u0001"+ + "\u0000\u0000\u0000\u0016w\u0001\u0000\u0000\u0000\u0018y\u0001\u0000\u0000"+ + "\u0000\u001a{\u0001\u0000\u0000\u0000\u001c\u0091\u0001\u0000\u0000\u0000"+ + "\u001e\u0093\u0001\u0000\u0000\u0000 \u0096\u0001\u0000\u0000\u0000\""+ + "\u0099\u0001\u0000\u0000\u0000$\u009c\u0001\u0000\u0000\u0000&\u00a5\u0001"+ + "\u0000\u0000\u0000(\u00aa\u0001\u0000\u0000\u0000*\u00b2\u0001\u0000\u0000"+ + "\u0000,\u00ba\u0001\u0000\u0000\u0000.\u00be\u0001\u0000\u0000\u00000"+ + "\u00c2\u0001\u0000\u0000\u00002\u00cb\u0001\u0000\u0000\u00004\u00d4\u0001"+ + "\u0000\u0000\u000068\u0003\u0002\u0001\u000076\u0001\u0000\u0000\u0000"+ + "78\u0001\u0000\u0000\u00008:\u0001\u0000\u0000\u00009;\u0003\u0010\b\u0000"+ + ":9\u0001\u0000\u0000\u0000:;\u0001\u0000\u0000\u0000;=\u0001\u0000\u0000"+ + "\u0000<>\u00034\u001a\u0000=<\u0001\u0000\u0000\u0000=>\u0001\u0000\u0000"+ + "\u0000>@\u0001\u0000\u0000\u0000?A\u0003\u0012\t\u0000@?\u0001\u0000\u0000"+ + "\u0000@A\u0001\u0000\u0000\u0000AC\u0001\u0000\u0000\u0000BD\u0003\u0014"+ + "\n\u0000CB\u0001\u0000\u0000\u0000CD\u0001\u0000\u0000\u0000DE\u0001\u0000"+ + "\u0000\u0000EF\u0003\u001c\u000e\u0000FG\u0005\u0000\u0000\u0001G\u0001"+ + "\u0001\u0000\u0000\u0000HJ\u0003\u0004\u0002\u0000IH\u0001\u0000\u0000"+ + "\u0000IJ\u0001\u0000\u0000\u0000JL\u0001\u0000\u0000\u0000KM\u0003\u0006"+ + "\u0003\u0000LK\u0001\u0000\u0000\u0000LM\u0001\u0000\u0000\u0000MO\u0001"+ + "\u0000\u0000\u0000NP\u0003\b\u0004\u0000ON\u0001\u0000\u0000\u0000OP\u0001"+ + "\u0000\u0000\u0000PR\u0001\u0000\u0000\u0000QS\u0003\n\u0005\u0000RQ\u0001"+ + "\u0000\u0000\u0000RS\u0001\u0000\u0000\u0000SU\u0001\u0000\u0000\u0000"+ + "TV\u0003\f\u0006\u0000UT\u0001\u0000\u0000\u0000UV\u0001\u0000\u0000\u0000"+ + "VX\u0001\u0000\u0000\u0000WY\u0003\u000e\u0007\u0000XW\u0001\u0000\u0000"+ + "\u0000XY\u0001\u0000\u0000\u0000Y\u0003\u0001\u0000\u0000\u0000Z[\u0007"+ + "\u0000\u0000\u0000[\u0005\u0001\u0000\u0000\u0000\\]\u0005\u0015\u0000"+ + "\u0000]\u0007\u0001\u0000\u0000\u0000^_\u0005~\u0000\u0000_\t\u0001\u0000"+ + "\u0000\u0000`a\u0005e\u0000\u0000a\u000b\u0001\u0000\u0000\u0000bc\u0005"+ + "-\u0000\u0000c\r\u0001\u0000\u0000\u0000de\u00054\u0000\u0000e\u000f\u0001"+ + "\u0000\u0000\u0000fg\u0005i\u0000\u0000g\u0011\u0001\u0000\u0000\u0000"+ + "hl\u0005\u0001\u0000\u0000ij\u0003\u001a\r\u0000jk\u0005\u0002\u0000\u0000"+ + "km\u0001\u0000\u0000\u0000li\u0001\u0000\u0000\u0000lm\u0001\u0000\u0000"+ + "\u0000mn\u0001\u0000\u0000\u0000no\u0003\u001a\r\u0000op\u0005\u0003\u0000"+ + "\u0000p\u0013\u0001\u0000\u0000\u0000qs\u0003\u0016\u000b\u0000rq\u0001"+ + "\u0000\u0000\u0000rs\u0001\u0000\u0000\u0000su\u0001\u0000\u0000\u0000"+ + "tv\u0003\u0018\f\u0000ut\u0001\u0000\u0000\u0000uv\u0001\u0000\u0000\u0000"+ + "v\u0015\u0001\u0000\u0000\u0000wx\u0005[\u0000\u0000x\u0017\u0001\u0000"+ + "\u0000\u0000yz\u0005U\u0000\u0000z\u0019\u0001\u0000\u0000\u0000{|\u0007"+ + "\u0001\u0000\u0000|\u001b\u0001\u0000\u0000\u0000}\u0080\u0003\u001e\u000f"+ + "\u0000~\u0080\u0003 \u0010\u0000\u007f}\u0001\u0000\u0000\u0000\u007f"+ + "~\u0001\u0000\u0000\u0000\u007f\u0080\u0001\u0000\u0000\u0000\u0080\u0082"+ + "\u0001\u0000\u0000\u0000\u0081\u0083\u0003\"\u0011\u0000\u0082\u0081\u0001"+ + "\u0000\u0000\u0000\u0082\u0083\u0001\u0000\u0000\u0000\u0083\u0085\u0001"+ + "\u0000\u0000\u0000\u0084\u0086\u0003$\u0012\u0000\u0085\u0084\u0001\u0000"+ + "\u0000\u0000\u0085\u0086\u0001\u0000\u0000\u0000\u0086\u0092\u0001\u0000"+ + "\u0000\u0000\u0087\u0089\u0003\"\u0011\u0000\u0088\u0087\u0001\u0000\u0000"+ + "\u0000\u0088\u0089\u0001\u0000\u0000\u0000\u0089\u008c\u0001\u0000\u0000"+ + "\u0000\u008a\u008d\u0003\u001e\u000f\u0000\u008b\u008d\u0003 \u0010\u0000"+ + "\u008c\u008a\u0001\u0000\u0000\u0000\u008c\u008b\u0001\u0000\u0000\u0000"+ + "\u008c\u008d\u0001\u0000\u0000\u0000\u008d\u008f\u0001\u0000\u0000\u0000"+ + "\u008e\u0090\u0003$\u0012\u0000\u008f\u008e\u0001\u0000\u0000\u0000\u008f"+ + "\u0090\u0001\u0000\u0000\u0000\u0090\u0092\u0001\u0000\u0000\u0000\u0091"+ + "\u007f\u0001\u0000\u0000\u0000\u0091\u0088\u0001\u0000\u0000\u0000\u0092"+ + "\u001d\u0001\u0000\u0000\u0000\u0093\u0094\u0005\u0005\u0000\u0000\u0094"+ + "\u0095\u00032\u0019\u0000\u0095\u001f\u0001\u0000\u0000\u0000\u0096\u0097"+ + "\u0005\u0006\u0000\u0000\u0097\u0098\u00032\u0019\u0000\u0098!\u0001\u0000"+ + "\u0000\u0000\u0099\u009a\u0005\u0007\u0000\u0000\u009a\u009b\u00032\u0019"+ + "\u0000\u009b#\u0001\u0000\u0000\u0000\u009c\u009d\u0005\b\u0000\u0000"+ + "\u009d\u00a2\u0007\u0002\u0000\u0000\u009e\u009f\u0005\u0001\u0000\u0000"+ + "\u009f\u00a0\u0003&\u0013\u0000\u00a0\u00a1\u0005\u0003\u0000\u0000\u00a1"+ + "\u00a3\u0001\u0000\u0000\u0000\u00a2\u009e\u0001\u0000\u0000\u0000\u00a2"+ + "\u00a3\u0001\u0000\u0000\u0000\u00a3%\u0001\u0000\u0000\u0000\u00a4\u00a6"+ + "\b\u0003\u0000\u0000\u00a5\u00a4\u0001\u0000\u0000\u0000\u00a6\u00a7\u0001"+ + "\u0000\u0000\u0000\u00a7\u00a5\u0001\u0000\u0000\u0000\u00a7\u00a8\u0001"+ + "\u0000\u0000\u0000\u00a8\'\u0001\u0000\u0000\u0000\u00a9\u00ab\u0003*"+ + "\u0015\u0000\u00aa\u00a9\u0001\u0000\u0000\u0000\u00aa\u00ab\u0001\u0000"+ + "\u0000\u0000\u00ab\u00ad\u0001\u0000\u0000\u0000\u00ac\u00ae\u0003.\u0017"+ + "\u0000\u00ad\u00ac\u0001\u0000\u0000\u0000\u00ad\u00ae\u0001\u0000\u0000"+ + "\u0000\u00ae\u00b0\u0001\u0000\u0000\u0000\u00af\u00b1\u00030\u0018\u0000"+ + "\u00b0\u00af\u0001\u0000\u0000\u0000\u00b0\u00b1\u0001\u0000\u0000\u0000"+ + "\u00b1)\u0001\u0000\u0000\u0000\u00b2\u00b7\u0003,\u0016\u0000\u00b3\u00b4"+ + "\u0005\t\u0000\u0000\u00b4\u00b6\u0003,\u0016\u0000\u00b5\u00b3\u0001"+ + "\u0000\u0000\u0000\u00b6\u00b9\u0001\u0000\u0000\u0000\u00b7\u00b5\u0001"+ + "\u0000\u0000\u0000\u00b7\u00b8\u0001\u0000\u0000\u0000\u00b8+\u0001\u0000"+ + "\u0000\u0000\u00b9\u00b7\u0001\u0000\u0000\u0000\u00ba\u00bc\u00034\u001a"+ + "\u0000\u00bb\u00bd\u0003\"\u0011\u0000\u00bc\u00bb\u0001\u0000\u0000\u0000"+ + "\u00bc\u00bd\u0001\u0000\u0000\u0000\u00bd-\u0001\u0000\u0000\u0000\u00be"+ + "\u00bf\u0005\u0001\u0000\u0000\u00bf\u00c0\u0003$\u0012\u0000\u00c0\u00c1"+ + "\u0005\u0003\u0000\u0000\u00c1/\u0001\u0000\u0000\u0000\u00c2\u00c3\u0005"+ + "\n\u0000\u0000\u00c3\u00c8\u00032\u0019\u0000\u00c4\u00c5\u0005\u000b"+ + "\u0000\u0000\u00c5\u00c7\u00032\u0019\u0000\u00c6\u00c4\u0001\u0000\u0000"+ + "\u0000\u00c7\u00ca\u0001\u0000\u0000\u0000\u00c8\u00c6\u0001\u0000\u0000"+ + "\u0000\u00c8\u00c9\u0001\u0000\u0000\u0000\u00c91\u0001\u0000\u0000\u0000"+ + "\u00ca\u00c8\u0001\u0000\u0000\u0000\u00cb\u00d0\u00034\u001a\u0000\u00cc"+ + "\u00cd\u0005\f\u0000\u0000\u00cd\u00cf\u00034\u001a\u0000\u00ce\u00cc"+ + "\u0001\u0000\u0000\u0000\u00cf\u00d2\u0001\u0000\u0000\u0000\u00d0\u00ce"+ + "\u0001\u0000\u0000\u0000\u00d0\u00d1\u0001\u0000\u0000\u0000\u00d13\u0001"+ + "\u0000\u0000\u0000\u00d2\u00d0\u0001\u0000\u0000\u0000\u00d3\u00d5\b\u0004"+ + "\u0000\u0000\u00d4\u00d3\u0001\u0000\u0000\u0000\u00d5\u00d6\u0001\u0000"+ + "\u0000\u0000\u00d6\u00d4\u0001\u0000\u0000\u0000\u00d6\u00d7\u0001\u0000"+ + "\u0000\u0000\u00d75\u0001\u0000\u0000\u0000\u001f7:=@CILORUXlru\u007f"+ + "\u0082\u0085\u0088\u008c\u008f\u0091\u00a2\u00a7\u00aa\u00ad\u00b0\u00b7"+ + "\u00bc\u00c8\u00d0\u00d6"; public static final ATN _ATN = new ATNDeserializer().deserialize(_serializedATN.toCharArray()); static { diff --git a/backend/services/syson-services/src/main/java/org/eclipse/syson/services/DiagramDirectEditListener.java b/backend/services/syson-services/src/main/java/org/eclipse/syson/services/DiagramDirectEditListener.java index 433e1f8d9..0ec1c2dba 100644 --- a/backend/services/syson-services/src/main/java/org/eclipse/syson/services/DiagramDirectEditListener.java +++ b/backend/services/syson-services/src/main/java/org/eclipse/syson/services/DiagramDirectEditListener.java @@ -33,12 +33,19 @@ import org.eclipse.sirius.components.representations.Message; import org.eclipse.sirius.components.representations.MessageLevel; import org.eclipse.syson.services.grammars.DirectEditBaseListener; +import org.eclipse.syson.services.grammars.DirectEditParser.AbstractPrefixExpressionContext; +import org.eclipse.syson.services.grammars.DirectEditParser.DerivedPrefixExpressionContext; +import org.eclipse.syson.services.grammars.DirectEditParser.DirectionPrefixExpressionContext; import org.eclipse.syson.services.grammars.DirectEditParser.EffectExpressionContext; +import org.eclipse.syson.services.grammars.DirectEditParser.EndPrefixExpressionContext; import org.eclipse.syson.services.grammars.DirectEditParser.ExpressionContext; import org.eclipse.syson.services.grammars.DirectEditParser.FeatureExpressionsContext; import org.eclipse.syson.services.grammars.DirectEditParser.MeasurementExpressionContext; import org.eclipse.syson.services.grammars.DirectEditParser.MultiplicityExpressionContext; import org.eclipse.syson.services.grammars.DirectEditParser.MultiplicityExpressionMemberContext; +import org.eclipse.syson.services.grammars.DirectEditParser.NonuniqueMultiplicityExpressionContext; +import org.eclipse.syson.services.grammars.DirectEditParser.OrderedMultiplicityExpressionContext; +import org.eclipse.syson.services.grammars.DirectEditParser.ReadonlyPrefixExpressionContext; import org.eclipse.syson.services.grammars.DirectEditParser.RedefinitionExpressionContext; import org.eclipse.syson.services.grammars.DirectEditParser.ReferenceExpressionContext; import org.eclipse.syson.services.grammars.DirectEditParser.SubsettingExpressionContext; @@ -46,6 +53,7 @@ import org.eclipse.syson.services.grammars.DirectEditParser.TriggerExpressionNameContext; import org.eclipse.syson.services.grammars.DirectEditParser.TypingExpressionContext; import org.eclipse.syson.services.grammars.DirectEditParser.ValueExpressionContext; +import org.eclipse.syson.services.grammars.DirectEditParser.VariationPrefixExpressionContext; import org.eclipse.syson.sysml.AcceptActionUsage; import org.eclipse.syson.sysml.ActionUsage; import org.eclipse.syson.sysml.AttributeDefinition; @@ -154,8 +162,16 @@ public void exitExpression(ExpressionContext ctx) { new AttributeToDirectEditSwitch(newValue).doSwitch(this.element); } } + this.handleMissingDirectionPrefixExpression(ctx); + this.handleMissingAbstractPrefixExpression(ctx); + this.handleMissingDerivedPrefixExpression(ctx); + this.handleMissingEndPrefixExpression(ctx); + this.handleMissingVariationPrefixExpression(ctx); + this.handleMissingReadonlyPrefixExpression(ctx); this.handleMissingReferenceExpression(ctx); this.handleMissingMultiplicityExpression(ctx); + this.handleMissingOrderedMultiplicityExpression(ctx); + this.handleMissingNonuniqueMultiplicityExpression(ctx); this.handleMissingSubclassificationExpression(ctx); this.handleMissingSubsettingExpression(ctx); this.handleMissingRedefinitionExpression(ctx); @@ -163,6 +179,84 @@ public void exitExpression(ExpressionContext ctx) { this.handleMissingValueExpression(ctx); } + @Override + public void exitDirectionPrefixExpression(DirectionPrefixExpressionContext ctx) { + if (this.element instanceof Usage usage) { + if (ctx != null) { + if (ctx.getText().equals(LabelConstants.IN + LabelConstants.SPACE)) { + usage.setDirection(FeatureDirectionKind.IN); + } else if (ctx.getText().equals(LabelConstants.OUT + LabelConstants.SPACE)) { + usage.setDirection(FeatureDirectionKind.OUT); + } else if (ctx.getText().equals(LabelConstants.INOUT + LabelConstants.SPACE)) { + usage.setDirection(FeatureDirectionKind.INOUT); + } + } else { + usage.setDirection(null); + } + } + super.exitDirectionPrefixExpression(ctx); + } + + @Override + public void exitAbstractPrefixExpression(AbstractPrefixExpressionContext ctx) { + if (this.element instanceof Usage usage) { + if (ctx != null) { + usage.setIsAbstract(true); + } else { + usage.setIsAbstract(false); + } + } + super.exitAbstractPrefixExpression(ctx); + } + + @Override + public void exitDerivedPrefixExpression(DerivedPrefixExpressionContext ctx) { + if (this.element instanceof Usage usage) { + if (ctx != null) { + usage.setIsDerived(true); + } else { + usage.setIsDerived(false); + } + } + super.exitDerivedPrefixExpression(ctx); + } + + @Override + public void exitEndPrefixExpression(EndPrefixExpressionContext ctx) { + if (this.element instanceof Usage usage) { + if (ctx != null) { + usage.setIsEnd(true); + } else { + usage.setIsEnd(false); + } + } + super.exitEndPrefixExpression(ctx); + } + + @Override + public void exitReadonlyPrefixExpression(ReadonlyPrefixExpressionContext ctx) { + if (this.element instanceof Usage usage) { + if (ctx != null) { + usage.setIsReadOnly(true); + } else { + usage.setIsReadOnly(false); + } + } + super.exitReadonlyPrefixExpression(ctx); + } + + @Override + public void exitVariationPrefixExpression(VariationPrefixExpressionContext ctx) { + if (this.element instanceof Usage usage) { + if (ctx != null) { + usage.setIsVariation(true); + } else { + usage.setIsVariation(false); + } + } + super.exitVariationPrefixExpression(ctx); + } + @Override public void exitReferenceExpression(ReferenceExpressionContext ctx) { if (this.element instanceof Usage usage) { @@ -204,6 +298,30 @@ public void exitMultiplicityExpression(MultiplicityExpressionContext ctx) { } } + @Override + public void exitOrderedMultiplicityExpression(OrderedMultiplicityExpressionContext ctx) { + if (this.element instanceof Usage usage) { + if (ctx != null) { + usage.setIsOrdered(true); + } else { + usage.setIsOrdered(false); + } + } + super.exitOrderedMultiplicityExpression(ctx); + } + + @Override + public void exitNonuniqueMultiplicityExpression(NonuniqueMultiplicityExpressionContext ctx) { + if (this.element instanceof Usage usage) { + if (ctx != null) { + usage.setIsUnique(false); + } else { + usage.setIsUnique(true); + } + } + super.exitNonuniqueMultiplicityExpression(ctx); + } + @Override public void exitTypingExpression(TypingExpressionContext ctx) { if (!this.options.contains(LabelService.TYPING_OFF) && this.element instanceof Usage usage) { @@ -723,6 +841,48 @@ public void visitErrorNode(ErrorNode node) { super.visitErrorNode(node); } + private void handleMissingDirectionPrefixExpression(ExpressionContext ctx) { + DirectionPrefixExpressionContext directionPrefixExpression = ctx.prefixExpression().directionPrefixExpression(); + if (this.element instanceof Usage usage && directionPrefixExpression == null) { + usage.setDirection(null); + } + } + + private void handleMissingAbstractPrefixExpression(ExpressionContext ctx) { + AbstractPrefixExpressionContext abstractPrefixExpression = ctx.prefixExpression().abstractPrefixExpression(); + if (this.element instanceof Usage usage && abstractPrefixExpression == null) { + usage.setIsAbstract(false); + } + } + + private void handleMissingDerivedPrefixExpression(ExpressionContext ctx) { + DerivedPrefixExpressionContext derivedPrefixExpression = ctx.prefixExpression().derivedPrefixExpression(); + if (this.element instanceof Usage usage && derivedPrefixExpression == null) { + usage.setIsDerived(false); + } + } + + private void handleMissingEndPrefixExpression(ExpressionContext ctx) { + EndPrefixExpressionContext endPrefixExpression = ctx.prefixExpression().endPrefixExpression(); + if (this.element instanceof Usage usage && endPrefixExpression == null) { + usage.setIsEnd(false); + } + } + + private void handleMissingReadonlyPrefixExpression(ExpressionContext ctx) { + ReadonlyPrefixExpressionContext readonlyPrefixExpression = ctx.prefixExpression().readonlyPrefixExpression(); + if (this.element instanceof Usage usage && readonlyPrefixExpression == null) { + usage.setIsReadOnly(false); + } + } + + private void handleMissingVariationPrefixExpression(ExpressionContext ctx) { + VariationPrefixExpressionContext variationPrefixExpression = ctx.prefixExpression().variationPrefixExpression(); + if (this.element instanceof Usage usage && variationPrefixExpression == null) { + usage.setIsVariation(false); + } + } + private void handleMissingReferenceExpression(ExpressionContext ctx) { ReferenceExpressionContext referenceExpression = ctx.referenceExpression(); if (this.element instanceof Usage usage && referenceExpression == null) { @@ -757,6 +917,20 @@ private boolean isDeleteMultiplicityExpression(MultiplicityExpressionContext mul && LabelConstants.CLOSE_BRACKET.equals(multiplicityExpression.getChild(1).getText()); } + private void handleMissingOrderedMultiplicityExpression(ExpressionContext ctx) { + OrderedMultiplicityExpressionContext orderedMultiplicityExpression = ctx.multiplicityPropExpression().orderedMultiplicityExpression(); + if (this.element instanceof Usage usage && orderedMultiplicityExpression == null) { + usage.setIsOrdered(false); + } + } + + private void handleMissingNonuniqueMultiplicityExpression(ExpressionContext ctx) { + NonuniqueMultiplicityExpressionContext nonuniqueMultiplicityExpression = ctx.multiplicityPropExpression().nonuniqueMultiplicityExpression(); + if (this.element instanceof Usage usage && nonuniqueMultiplicityExpression == null) { + usage.setIsUnique(true); + } + } + private void handleMissingSubclassificationExpression(ExpressionContext ctx) { if (this.options.contains(LabelService.SUBSETTING_OFF)) { return; diff --git a/backend/services/syson-services/src/main/resources/DirectEdit.g4 b/backend/services/syson-services/src/main/resources/DirectEdit.g4 index 811d35979..cdd763f67 100644 --- a/backend/services/syson-services/src/main/resources/DirectEdit.g4 +++ b/backend/services/syson-services/src/main/resources/DirectEdit.g4 @@ -29,17 +29,57 @@ package org.eclipse.syson.services.grammars; } expression : - referenceExpression? name? multiplicityExpression? featureExpressions EOF + prefixExpression? referenceExpression? name? multiplicityExpression? multiplicityPropExpression? featureExpressions EOF +; + +prefixExpression : + directionPrefixExpression? abstractPrefixExpression? variationPrefixExpression? readonlyPrefixExpression? derivedPrefixExpression? endPrefixExpression? +; + +directionPrefixExpression : + IN_PREFIX | OUT_PREFIX | INOUT_PREFIX +; + +abstractPrefixExpression : + ABSTRACT_PREFIX +; + +variationPrefixExpression : + VARIATION_PREFIX +; + +readonlyPrefixExpression : + READONLY_PREFIX +; + +derivedPrefixExpression : + DERIVED_PREFIX +; + +endPrefixExpression : + END_PREFIX ; referenceExpression : - 'ref ' + REF_PREFIX ; multiplicityExpression : '[' (lowerBound=multiplicityExpressionMember '..') ? upperBound=multiplicityExpressionMember ']' ; +multiplicityPropExpression : + orderedMultiplicityExpression? nonuniqueMultiplicityExpression? +; + +orderedMultiplicityExpression : + ORDERED_SUFFIX +; + +nonuniqueMultiplicityExpression : + NONUNIQUE_SUFFIX +; + multiplicityExpressionMember : Integer | '*' ; @@ -117,7 +157,7 @@ name : // We can't use ANY+ or .+ here because it conflicts with reserved keywords, which will be matched over ANY since // they are longer. Using .+ is also too greedy, and will match ':' ':>' etc, making the parser unable to properly // handle the input. - ~('ref ' | ':' | ':>' | '::>' | ':>>' | '=' | '[' )+ + ~(':' | ':>' | '::>' | ':>>' | '=' | '[' | ORDERED_SUFFIX | NONUNIQUE_SUFFIX )+ ; @@ -125,6 +165,7 @@ name : ABOUT : 'about'; ABSTRACT : 'abstract'; +ABSTRACT_PREFIX : ABSTRACT WS; ALIAS : 'alias'; ALL : 'all'; AND : 'and'; @@ -148,12 +189,14 @@ DATATYPE : 'datatype'; DEFAULT : 'default'; DEPENDENCY : 'dependency'; DERIVED : 'derived'; +DERIVED_PREFIX : DERIVED WS; DIFFERENCES : 'differences'; DISJOINING : 'disjoining'; DISJOINT : 'disjoint'; DOC : 'doc'; ELSE : 'else'; END : 'end'; +END_PREFIX : END WS; EXPR : 'expr'; FALSE : 'false'; FEATURE : 'feature'; @@ -171,7 +214,9 @@ INTERSECTS : 'intersects'; IMPLIES : 'implies'; IMPORT : 'import'; IN : 'in'; -INPUT : 'inout'; +IN_PREFIX : IN WS; +INOUT : 'inout'; +INOUT_PREFIX : INOUT WS; INTERACTION : 'interaction'; INV : 'inv'; INVERSE : 'inverse'; @@ -184,12 +229,15 @@ METADATA : 'metadata'; MULTIPLICITY : 'multiplicity'; NAMESPACE : 'namespace'; NONUNIQUE : 'nonunique'; +NONUNIQUE_SUFFIX : WS NONUNIQUE; NOT : 'not'; NULL : 'null'; OF : 'of'; OR : 'or'; ORDERED : 'ordered'; +ORDERED_SUFFIX : WS ORDERED; OUT : 'out'; +OUT_PREFIX : OUT WS; PACKAGE : 'package'; PORTION : 'portion'; PREDICATE : 'predicate'; @@ -197,9 +245,12 @@ PRIAVTE : 'private'; PROTECTED : 'protected'; PUBLIC : 'public'; READONLY : 'readonly'; +READONLY_PREFIX : READONLY WS; REDEFINES : 'redefines'; REDEFINITION : 'redefinition'; -RFERENCES : 'references'; +REF : 'ref'; +REF_PREFIX : REF WS; +REFERENCES : 'references'; REP : 'rep'; RETURN : 'return'; SPECIALIZTION : 'specialization'; @@ -218,6 +269,8 @@ TYPE : 'type'; TYPED : 'typed'; TYPING : 'typing'; UNIONS : 'unions'; +VARIATION : 'variation'; +VARIATION_PREFIX : VARIATION WS; XOR: 'xor'; // This rule is required to make sure the parser rule "name" can match any input (since it is defined as a negation we diff --git a/doc/content/modules/user-manual/pages/release-notes/2024.9.0.adoc b/doc/content/modules/user-manual/pages/release-notes/2024.9.0.adoc index eea275f92..a4d5aa7a6 100644 --- a/doc/content/modules/user-manual/pages/release-notes/2024.9.0.adoc +++ b/doc/content/modules/user-manual/pages/release-notes/2024.9.0.adoc @@ -106,6 +106,9 @@ It is now possible to configure the measurement unit for the value of an element - Allow to select existing _Type_ on Subject tool. - Display prefix keywords in label for Usage compartment element - Display multiplicity suffix property keywords in label for Usage element +- Allow direct edit of prefix keywords and multiplicity suffix for Usage elements +* Prefixing or not the name of an Usage attribute with direction or "abstract" or "variation" or "readonly" or "derived" or "end" (this order counts) sets its matching property with the correct value +* Suffixing or not the name of an Usage attribute with "ordered" or "nonunique" (this order counts) sets its matching property with the correct value == New features diff --git a/integration-tests/cypress/e2e/project/diagrams/general-view/directEditTests.cy.ts b/integration-tests/cypress/e2e/project/diagrams/general-view/directEditTests.cy.ts index 2f429dfaa..56d9eece7 100644 --- a/integration-tests/cypress/e2e/project/diagrams/general-view/directEditTests.cy.ts +++ b/integration-tests/cypress/e2e/project/diagrams/general-view/directEditTests.cy.ts @@ -15,10 +15,12 @@ import { Project } from '../../../../pages/Project'; import { SysMLv2 } from '../../../../usecases/SysMLv2'; import { Diagram } from '../../../../workbench/Diagram'; import { Explorer } from '../../../../workbench/Explorer'; +import { Details } from '../../../../workbench/Details'; describe('Node Creation Tests', () => { const sysmlv2 = new SysMLv2(); const diagramLabel = 'General View'; + const details = new Details(); context('Given a SysMLv2 project with a General View diagram', () => { const explorer = new Explorer(); @@ -81,7 +83,7 @@ describe('Node Creation Tests', () => { diagram.getNodes(diagramLabel, 'p1 :> Parts::parts').should('exist'); }); - it.only('We can add a value to 10 [kg] by direct editing the existing PartUsage', () => { + it('We can add a value to 10 [kg] by direct editing the existing PartUsage', () => { diagram.getNodes(diagramLabel, 'part').type('p1 = 10 [kg]{enter}'); diagram.getNodes(diagramLabel, 'p1 = 10 [kg]').should('exist'); // Check that the library containing kg has been imported @@ -94,6 +96,92 @@ describe('Node Creation Tests', () => { diagram.getNodes(diagramLabel, 'p1 :> aNewPart').should('exist'); explorer.getExplorerView().contains('aNewPart'); }); + + it('We can rename a part with a name containing a properties keyword', () => { + diagram.getNodes(diagramLabel, 'part').type('abstractPart{enter}'); + diagram.getNodes(diagramLabel, 'abstractPart').should('exist'); + explorer.getExplorerView().contains('abstractPart'); + }); + + it('We can add properties to a new compartment item by direct editing the existing compartment item', () => { + diagram.getNodes(diagramLabel, 'part').click(); + diagram + .getNodes(diagramLabel, 'part') + .getByTestId('Palette') + .should('exist') + .findByTestId('Create') + .findByTestId('expand') + .click(); + diagram + .getNodes(diagramLabel, 'part') + .getByTestId('Palette') + .should('exist') + .find('div[role=tooltip]') + .findByTestId('New Attribute - Tool') + .click(); + + diagram.getNodes(diagramLabel, 'attribute').should('exist'); + + // direct edit attribute + cy.getByTestId('IconLabel - attribute').type('abstract variation end myAttribute ordered nonunique{enter}'); + diagram.getNodes(diagramLabel, 'myAttribute').should('exist'); + + // check attribute properties + details.getPage('Advanced').click(); + details.getGroup('Attribute Properties').should('be.visible'); + details.getDetailsView().find(`[data-testid="Is Abstract"]`).should('have.class', 'Mui-checked'); + details.getDetailsView().find(`[data-testid="Is Variation"]`).should('have.class', 'Mui-checked'); + details.getDetailsView().find(`[data-testid="Is End"]`).should('have.class', 'Mui-checked'); + details.getDetailsView().find(`[data-testid="Is Ordered"]`).should('have.class', 'Mui-checked'); + details.getDetailsView().find(`[data-testid="Is Unique"]`).should('not.have.class', 'Mui-checked'); + + // reset attribute to default properties + diagram.getNodes(diagramLabel, 'myAttribute').should('exist'); + cy.getByTestId('IconLabel - abstract variation end myAttribute ordered nonunique').type('myAttribute{enter}'); + + // check attribute properties + details.getPage('Advanced').click(); + details.getGroup('Attribute Properties').should('be.visible'); + details.getDetailsView().find(`[data-testid="Is Abstract"]`).should('not.have.class', 'Mui-checked'); + details.getDetailsView().find(`[data-testid="Is Variation"]`).should('not.have.class', 'Mui-checked'); + details.getDetailsView().find(`[data-testid="Is End"]`).should('not.have.class', 'Mui-checked'); + details.getDetailsView().find(`[data-testid="Is Ordered"]`).should('not.have.class', 'Mui-checked'); + details.getDetailsView().find(`[data-testid="Is Unique"]`).should('have.class', 'Mui-checked'); + }); + + it('We can add direction to a new compartment item by direct editing the existing compartment item', () => { + diagram.getNodes(diagramLabel, 'part').click(); + diagram + .getNodes(diagramLabel, 'part') + .getByTestId('Palette') + .should('exist') + .findByTestId('Create') + .findByTestId('expand') + .click(); + diagram + .getNodes(diagramLabel, 'part') + .getByTestId('Palette') + .should('exist') + .find('div[role=tooltip]') + .findByTestId('New Attribute - Tool') + .click(); + + diagram.getNodes(diagramLabel, 'attribute').should('exist'); + + // direct edit attribute + cy.getByTestId('IconLabel - attribute').type('inout myAttribute{enter}'); + diagram.getNodes(diagramLabel, 'myAttribute').should('exist'); + + // check direction attribute + details.getRadioOption('Direction', 'inout').should('be.checked'); + + // reset attribute to default properties + diagram.getNodes(diagramLabel, 'myAttribute').should('exist'); + cy.getByTestId('IconLabel - inout myAttribute').type('myAttribute{enter}'); + + // check direction attribute + details.getRadioOption('Direction', 'inout').should('not.be.checked'); + }); }); }); }); diff --git a/integration-tests/cypress/workbench/Details.ts b/integration-tests/cypress/workbench/Details.ts index 16262ec67..b0a4af816 100644 --- a/integration-tests/cypress/workbench/Details.ts +++ b/integration-tests/cypress/workbench/Details.ts @@ -16,6 +16,10 @@ export class Details { return cy.getByTestId('view-Details'); } + public getPage(label: string): Cypress.Chainable> { + return cy.get(`[data-testid="page-tab-${label}"] div > div`); + } + public getGroup(label: string): Cypress.Chainable> { return this.getDetailsView().find(`[data-testid="group-${label}"]`); } @@ -24,8 +28,8 @@ export class Details { return this.getDetailsView().find(`[data-testid="input-${label}"]`); } - public getCheckBox(label: string): Cypress.Chainable> { - return this.getDetailsView().findByTestId(label).find('input'); + public getCheckBoxInput(label: string): Cypress.Chainable> { + return this.getDetailsView().find(`[data-testid="${label}"]`).get('input[type="checkbox"]'); } public getRadioOption(label: string, option: string): Cypress.Chainable> {